@nyaruka/temba-components 0.26.6 → 0.26.9

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.
Files changed (106) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/demo/index.html +9 -1
  3. package/dist/{29fc0c7c.js → d0cc86be.js} +403 -56
  4. package/dist/index.js +403 -56
  5. package/dist/static/icons/symbol-defs.svg +13 -1
  6. package/dist/static/img/schemes/email.svg +1 -0
  7. package/dist/static/img/schemes/facebook.svg +1 -0
  8. package/dist/static/img/schemes/instagram.svg +1 -0
  9. package/dist/static/img/schemes/line.svg +1 -0
  10. package/dist/static/img/schemes/messenger.svg +1 -0
  11. package/dist/static/img/schemes/tel.svg +34 -0
  12. package/dist/static/img/schemes/telegram.svg +1 -0
  13. package/dist/static/img/schemes/twitter.svg +1 -0
  14. package/dist/static/img/schemes/viber.svg +1 -0
  15. package/dist/static/img/schemes/vk.svg +1 -0
  16. package/dist/static/img/schemes/whatsapp.svg +1 -0
  17. package/dist/sw.js +1 -1
  18. package/dist/sw.js.map +1 -1
  19. package/dist/templates/components-body.html +1 -1
  20. package/dist/templates/components-head.html +1 -1
  21. package/out-tsc/src/RapidElement.js.map +1 -1
  22. package/out-tsc/src/RefreshElement.js +28 -0
  23. package/out-tsc/src/RefreshElement.js.map +1 -0
  24. package/out-tsc/src/button/Button.js +4 -0
  25. package/out-tsc/src/button/Button.js.map +1 -1
  26. package/out-tsc/src/contacts/ContactChat.js +5 -13
  27. package/out-tsc/src/contacts/ContactChat.js.map +1 -1
  28. package/out-tsc/src/contacts/ContactFieldEditor.js +199 -0
  29. package/out-tsc/src/contacts/ContactFieldEditor.js.map +1 -0
  30. package/out-tsc/src/contacts/ContactFields.js +106 -0
  31. package/out-tsc/src/contacts/ContactFields.js.map +1 -0
  32. package/out-tsc/src/contacts/ContactGroups.js +39 -0
  33. package/out-tsc/src/contacts/ContactGroups.js.map +1 -0
  34. package/out-tsc/src/contacts/ContactName.js +40 -0
  35. package/out-tsc/src/contacts/ContactName.js.map +1 -0
  36. package/out-tsc/src/contacts/ContactStoreElement.js +44 -0
  37. package/out-tsc/src/contacts/ContactStoreElement.js.map +1 -0
  38. package/out-tsc/src/contacts/ContactUrn.js +38 -0
  39. package/out-tsc/src/contacts/ContactUrn.js.map +1 -0
  40. package/out-tsc/src/contacts/events.js +76 -30
  41. package/out-tsc/src/contacts/events.js.map +1 -1
  42. package/out-tsc/src/contactsearch/ContactSearch.js +1 -1
  43. package/out-tsc/src/contactsearch/ContactSearch.js.map +1 -1
  44. package/out-tsc/src/interfaces.js +1 -0
  45. package/out-tsc/src/interfaces.js.map +1 -1
  46. package/out-tsc/src/label/Label.js +32 -12
  47. package/out-tsc/src/label/Label.js.map +1 -1
  48. package/out-tsc/src/select/Select.js +4 -4
  49. package/out-tsc/src/select/Select.js.map +1 -1
  50. package/out-tsc/src/store/Store.js +97 -3
  51. package/out-tsc/src/store/Store.js.map +1 -1
  52. package/out-tsc/src/store/StoreElement.js +55 -0
  53. package/out-tsc/src/store/StoreElement.js.map +1 -0
  54. package/out-tsc/src/textinput/TextInput.js +35 -17
  55. package/out-tsc/src/textinput/TextInput.js.map +1 -1
  56. package/out-tsc/src/vectoricon/VectorIcon.js +16 -14
  57. package/out-tsc/src/vectoricon/VectorIcon.js.map +1 -1
  58. package/out-tsc/temba-modules.js +12 -0
  59. package/out-tsc/temba-modules.js.map +1 -1
  60. package/out-tsc/test/temba-contact-history.test.js +1 -1
  61. package/out-tsc/test/temba-contact-history.test.js.map +1 -1
  62. package/package.json +4 -5
  63. package/rollup.config.js +1 -0
  64. package/screenshots/truth/contacts/history.png +0 -0
  65. package/src/RapidElement.ts +0 -1
  66. package/src/RefreshElement.ts +33 -0
  67. package/src/button/Button.ts +4 -0
  68. package/src/contacts/ContactChat.ts +7 -16
  69. package/src/contacts/ContactFieldEditor.ts +201 -0
  70. package/src/contacts/ContactFields.ts +112 -0
  71. package/src/contacts/ContactGroups.ts +41 -0
  72. package/src/contacts/ContactName.ts +37 -0
  73. package/src/contacts/ContactStoreElement.ts +51 -0
  74. package/src/contacts/ContactUrn.ts +38 -0
  75. package/src/contacts/events.ts +83 -30
  76. package/src/contactsearch/ContactSearch.ts +1 -1
  77. package/src/interfaces.ts +2 -0
  78. package/src/label/Label.ts +30 -7
  79. package/src/select/Select.ts +4 -4
  80. package/src/store/Store.ts +124 -3
  81. package/src/store/StoreElement.ts +71 -0
  82. package/src/textinput/TextInput.ts +48 -27
  83. package/src/vectoricon/VectorIcon.ts +19 -14
  84. package/static/icons/Read Me.txt +1 -1
  85. package/static/icons/SVG/calendar1.svg +5 -0
  86. package/static/icons/SVG/corner-down-left.svg +5 -0
  87. package/static/icons/SVG/more-horizontal.svg +5 -0
  88. package/static/icons/SVG/refresh-cw.svg +5 -0
  89. package/static/icons/demo-external-svg.html +21 -1
  90. package/static/icons/demo.html +34 -2
  91. package/static/icons/selection.json +412 -316
  92. package/static/icons/symbol-defs.svg +13 -1
  93. package/static/img/schemes/email.svg +1 -0
  94. package/static/img/schemes/facebook.svg +1 -0
  95. package/static/img/schemes/instagram.svg +1 -0
  96. package/static/img/schemes/line.svg +1 -0
  97. package/static/img/schemes/messenger.svg +1 -0
  98. package/static/img/schemes/tel.svg +34 -0
  99. package/static/img/schemes/telegram.svg +1 -0
  100. package/static/img/schemes/twitter.svg +1 -0
  101. package/static/img/schemes/viber.svg +1 -0
  102. package/static/img/schemes/vk.svg +1 -0
  103. package/static/img/schemes/whatsapp.svg +1 -0
  104. package/temba-modules.ts +12 -0
  105. package/test/temba-contact-history.test.ts +1 -1
  106. package/test-assets/contacts/history.json +5 -4
@@ -0,0 +1 @@
1
+ <?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><circle cx="256" cy="256" fill="#31C139" id="ellipse" r="256"/><path d="M256,123.5c40.7,0.4,78.2,11,110.8,36.2c22,16.9,38.2,38.2,45.5,65.4c8.5,31.9,2.4,61.3-15.8,88.5 c-13,19.3-30.2,34.5-47.9,49.2c-28.5,23.6-59.1,44.1-91.7,61.6c-2.9,1.5-5.9,2.9-9,3.8c-5.1,1.4-8.7-1.9-7.8-7.1 c0.4-2.5,1.7-4.9,2.3-7.4c1.6-7.7,3.5-15.4,4.4-23.3c0.7-6-2.5-8.6-8.5-9.1c-37-3.4-70.6-15.7-99-40c-24.6-21-39.9-47.4-42.7-79.9 c-2.4-28.2,6-53.5,23.1-75.9c23.3-30.4,54.8-47.8,91.4-56.8C225.7,125,240.7,123.3,256,123.5z M253.4,244.8c1.1,1.4,1.7,2,2.1,2.6 c9.7,13.2,19.4,26.4,29.2,39.6c2.9,3.9,6.6,5.4,10.3,4.2c3.7-1.2,5.8-4.2,5.8-9c0-20.5,0-41-0.1-61.6c0-5.1-3.7-8.8-8.4-8.8 c-4.7,0-8.3,3.9-8.3,9.2c0,11.2,0,22.4-0.1,33.7c0,1-0.2,1.9-0.4,3.6c-1.1-1.3-1.7-2.1-2.2-2.8c-9.5-12.9-18.9-25.8-28.4-38.6 c-3.3-4.4-6.4-5.8-10.4-4.6c-4.1,1.3-5.9,4.4-5.9,10c-0.1,19.7-0.1,39.4-0.1,59.1c0,6.2,3.3,9.9,8.4,10c5.2,0.1,8.5-3.6,8.6-9.7 c0.1-7.5-0.1-15.1-0.1-22.6C253.4,254.7,253.4,250.2,253.4,244.8z M328.9,228.7c7.3,0,14.3,0,21.4,0c5.9,0,9.7-3.3,9.8-8.2 c0.1-5.2-3.6-8.8-9.6-8.8c-9.6-0.1-19.1-0.1-28.7,0c-6.8,0.1-9.9,3.2-10,10.2c-0.1,6,0,12,0,18.1c0,14-0.1,27.9-0.1,41.9 c0,6.5,3.1,9.6,9.5,9.6c10.1,0,20.2,0,30.4,0c4.1,0,6.8-2,8.2-5.6c2.1-5.3-2.3-11.1-8.4-11.2c-7.5-0.1-15,0-22.6,0 c0-5.1,0-9.6,0-14.5c7.6,0,15,0,22.3,0c5.2,0,8.8-3.4,9-8.1c0.2-4.9-3.4-8.5-8.9-8.7c-2.3-0.1-4.6,0-7,0c-5.1,0-10.3,0-15.4,0 C328.9,238.1,328.9,233.7,328.9,228.7z M169,274.7c0-2.1,0-3.7,0-5.3c0-16,0-32-0.1-48c0-5.9-3.5-9.6-8.4-9.6 c-4.9,0-8.3,3.8-8.3,9.7c-0.1,20.1-0.1,40.2-0.1,60.3c0,6.4,3.2,9.5,9.6,9.6c9.7,0,19.4,0,29.1,0c5.9,0,9.6-3.2,9.7-8.2 c0.1-5-4-8.4-10-8.5C183.6,274.7,176.7,274.7,169,274.7z M208,251.4c0,0-0.1,0-0.1,0c0,10.1,0,20.2,0,30.4c0,5.8,3.4,9.5,8.4,9.6 c5,0,8.4-3.6,8.4-9.4c0-20.4-0.1-40.7-0.2-61.1c0-1.7-0.4-3.6-1.3-5c-2.1-3.4-5.4-4.5-9.2-3.5c-3.7,1-5.9,4.1-6,8.8 C208,231.2,208,241.3,208,251.4z" fill="#FFFFFF" id="logo"/></svg>
@@ -0,0 +1 @@
1
+ <svg id="Слой_1" data-name="Слой 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 25.26 25.26"><defs><style>.cls-1,.cls-2{fill-rule:evenodd;}.cls-1{fill:url(#Новый_образец_градиентной_залив);}.cls-2{fill:#fff;}</style><linearGradient id="Новый_образец_градиентной_залив" x1="15.59" y1="29.76" x2="15.59" y2="4.51" gradientTransform="matrix(1, 0, 0, -1, 0, 32.72)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00b2ff"/><stop offset="1" stop-color="#006aff"/></linearGradient></defs><g id="Messenger"><path id="Bubble_Solid" data-name="Bubble Solid" class="cls-1" d="M15.59,3C8.48,3,3,8.17,3,15.21a12,12,0,0,0,4,9.06,1.06,1.06,0,0,1,.34.72l.07,2.25a1,1,0,0,0,1.42.89l2.5-1.1a1,1,0,0,1,.67-.05,14.12,14.12,0,0,0,3.66.48c7.12,0,12.63-5.21,12.63-12.25S22.71,3,15.59,3Z" transform="translate(-2.96 -2.96)"/><path id="Bolt" class="cls-2" d="M8,18.79l3.71-5.88a1.9,1.9,0,0,1,2.74-.51l2.95,2.22a.77.77,0,0,0,.91,0l4-3a.6.6,0,0,1,.87.8l-3.7,5.88a1.9,1.9,0,0,1-2.74.51l-3-2.22a.76.76,0,0,0-.92,0l-4,3A.6.6,0,0,1,8,18.79Z" transform="translate(-2.96 -2.96)"/></g></svg>
@@ -0,0 +1,34 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+
3
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
+ viewBox="0 0 64 64" style="enable-background:new 0 0 64 64;" xml:space="preserve">
5
+ <style type="text/css">
6
+ .st0{fill:#1dbf53;}
7
+ .st1{opacity:0.2;}
8
+ .st2{fill:#231F20;}
9
+ .st3{fill:#FFFFFF;}
10
+ </style>
11
+ <g id="Layer_1">
12
+ <g>
13
+ <circle class="st0" cx="32" cy="32" r="32"/>
14
+ </g>
15
+ <g class="st1">
16
+ <g>
17
+ <path class="st2" d="M29,25.3c-0.4-4.8-5.4-7.1-5.6-7.2C23.1,18,22.9,18,22.7,18c-5.8,1-6.6,4.3-6.7,4.5c0,0.2,0,0.4,0,0.6
18
+ c6.9,21.4,21.2,25.3,25.9,26.6c0.4,0.1,0.7,0.2,0.9,0.3c0.1,0,0.2,0.1,0.3,0.1c0.2,0,0.3,0,0.5-0.1c0.1-0.1,3.5-1.7,4.4-6.9
19
+ c0-0.2,0-0.5-0.1-0.7c-0.1-0.1-1.9-3.5-6.8-4.7c-0.3-0.1-0.7,0-1,0.2c-1.6,1.3-3.7,2.7-4.6,2.9c-6.2-3-9.7-8.9-9.8-10
20
+ c-0.1-0.6,1.3-2.8,3-4.6C28.9,26,29,25.6,29,25.3z"/>
21
+ </g>
22
+ </g>
23
+ <g>
24
+ <g>
25
+ <path class="st3" d="M29,23.3c-0.4-4.8-5.4-7.1-5.6-7.2C23.1,16,22.9,16,22.7,16c-5.8,1-6.6,4.3-6.7,4.5c0,0.2,0,0.4,0,0.6
26
+ c6.9,21.4,21.2,25.3,25.9,26.6c0.4,0.1,0.7,0.2,0.9,0.3c0.1,0,0.2,0.1,0.3,0.1c0.2,0,0.3,0,0.5-0.1c0.1-0.1,3.5-1.7,4.4-6.9
27
+ c0-0.2,0-0.5-0.1-0.7c-0.1-0.1-1.9-3.5-6.8-4.7c-0.3-0.1-0.7,0-1,0.2c-1.6,1.3-3.7,2.7-4.6,2.9c-6.2-3-9.7-8.9-9.8-10
28
+ c-0.1-0.6,1.3-2.8,3-4.6C28.9,24,29,23.6,29,23.3z"/>
29
+ </g>
30
+ </g>
31
+ </g>
32
+ <g id="Layer_2">
33
+ </g>
34
+ </svg>
@@ -0,0 +1 @@
1
+ <svg id="Слой_1" data-name="Слой 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 27.36 27.36"><defs><style>.cls-1{fill:url(#Безымянный_градиент_3);}.cls-2{fill:#fff;}</style><linearGradient id="Безымянный_градиент_3" x1="-281.92" y1="231.15" x2="-283.9" y2="226.54" gradientTransform="matrix(3.47, 0, 0, -3.47, 995.97, 806.4)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#37aee2"/><stop offset="1" stop-color="#1e96c8"/></linearGradient></defs><circle class="cls-1" cx="13.68" cy="13.68" r="13.68"/><path class="cls-2" d="M21,9.43,7.24,14.79a.5.5,0,0,0,0,1l3.49,1,1.31,4.14a.59.59,0,0,0,1,.24l1.81-1.84,3.55,2.6a.74.74,0,0,0,1.16-.44L22,10.23A.7.7,0,0,0,21,9.43Zm-1.72,2.49-6.4,5.65a.39.39,0,0,0-.11.22L12.52,20a.07.07,0,0,1-.13,0l-1-3.26a.34.34,0,0,1,.15-.4l7.55-4.68A.17.17,0,0,1,19.28,11.92Z" transform="translate(-1.91 -1.91)"/></svg>
@@ -0,0 +1 @@
1
+ <svg id="Слой_1" data-name="Слой 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 27.36 27.36"><defs><style>.cls-1{fill:#1da1f2;}.cls-2{fill:#fff;}</style></defs><g id="Dark_Blue" data-name="Dark Blue"><circle class="cls-1" cx="13.68" cy="13.68" r="13.68"/></g><g id="Logo_FIXED" data-name="Logo — FIXED"><path class="cls-2" d="M13.09,22.81a9.32,9.32,0,0,0,9.38-9.39V13a6.84,6.84,0,0,0,1.64-1.71,6.52,6.52,0,0,1-1.89.52A3.35,3.35,0,0,0,23.67,10a6.62,6.62,0,0,1-2.09.8A3.3,3.3,0,0,0,15.87,13a3.08,3.08,0,0,0,.09.75,9.37,9.37,0,0,1-6.8-3.45A3.34,3.34,0,0,0,8.72,12a3.28,3.28,0,0,0,1.47,2.74,3.21,3.21,0,0,1-1.5-.41v0a3.31,3.31,0,0,0,2.65,3.24,3.51,3.51,0,0,1-.87.11,3.26,3.26,0,0,1-.62-.06A3.3,3.3,0,0,0,12.93,20a6.64,6.64,0,0,1-4.1,1.4,6.85,6.85,0,0,1-.79,0,9.27,9.27,0,0,0,5.05,1.49" transform="translate(-1.91 -1.91)"/></g></svg>
@@ -0,0 +1 @@
1
+ <svg id="Слой_1" data-name="Слой 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 27.36 27.36"><defs><style>.cls-1{fill:#7360f2;}.cls-2{fill:none;}.cls-3{fill:#fff;}</style></defs><circle class="cls-1" cx="13.68" cy="13.68" r="13.68"/><path class="cls-2" d="M21.26,10.25c-.36-.33-1.92-1.31-5.19-1.33,0,0-3.86-.25-5.73,1.45-1.05,1-1.4,2.56-1.44,4.43s-.24,5.44,3.18,6.39c0,0,0,2.66,0,2.89s0,.27.12.3a.3.3,0,0,0,.25-.11c.55-.54,2.3-2.66,2.3-2.66a14.43,14.43,0,0,0,4.42-.37,4,4,0,0,0,3.47-3.88C23.08,13.75,22.47,11.28,21.26,10.25Zm-1.42,8.52h0a3.34,3.34,0,0,1-.67.82h0a1.38,1.38,0,0,1-.68.33h-.1a.7.7,0,0,1-.29,0h0A10.27,10.27,0,0,1,16.21,19a11.47,11.47,0,0,1-1.57-1c-.24-.2-.48-.41-.7-.63l0,0,0,0,0,0,0,0a8.47,8.47,0,0,1-.63-.7,11.47,11.47,0,0,1-1-1.57,10.27,10.27,0,0,1-.87-1.87h0a.92.92,0,0,1,0-.29.34.34,0,0,1,0-.1,1.38,1.38,0,0,1,.33-.68h0a3.34,3.34,0,0,1,.82-.67h0a.62.62,0,0,1,.8.13s.42.5.6.75a9.1,9.1,0,0,1,.51.8.69.69,0,0,1-.13.89l-.4.33a.61.61,0,0,0-.18.47,4.21,4.21,0,0,0,2.84,2.84.61.61,0,0,0,.47-.18l.33-.4a.71.71,0,0,1,.89-.13,9.1,9.1,0,0,1,.8.51c.25.18.75.6.75.6A.62.62,0,0,1,19.84,18.77Zm-3.76-6.42a.22.22,0,0,1-.2-.24.21.21,0,0,1,.23-.2,3.13,3.13,0,0,1,2.19,1A3,3,0,0,1,19.07,15a.21.21,0,0,1-.22.21h0a.22.22,0,0,1-.22-.22A2.49,2.49,0,0,0,18,13.17,2.71,2.71,0,0,0,16.08,12.35ZM18,14.64a.22.22,0,0,1-.21.23h0a.22.22,0,0,1-.21-.21,1,1,0,0,0-1.1-1.14.22.22,0,0,1,0-.44A1.47,1.47,0,0,1,18,14.64Zm2.05,1h0a.22.22,0,0,1-.22-.22,4.25,4.25,0,0,0-1.17-3.11,4,4,0,0,0-2.9-1.14A.22.22,0,0,1,15.5,11a.21.21,0,0,1,.21-.22h0a4.43,4.43,0,0,1,3.19,1.27,4.6,4.6,0,0,1,1.31,3.42A.22.22,0,0,1,20,15.69Z" transform="translate(-1.91 -1.91)"/><path class="cls-3" d="M22.16,9.37c-.43-.39-2.16-1.65-6-1.66,0,0-4.55-.28-6.77,1.75-1.23,1.24-1.67,3-1.71,5.29s-.11,6.43,3.94,7.57h0v1.74s0,.7.43.84.89-.36,1.43-.93c.29-.32.7-.78,1-1.14a15.62,15.62,0,0,0,5.14-.38,5,5,0,0,0,4.23-4.78C24.37,13.34,23.59,10.61,22.16,9.37Zm.47,8a4,4,0,0,1-3.47,3.88,14.43,14.43,0,0,1-4.42.37s-1.75,2.12-2.3,2.66a.3.3,0,0,1-.25.11c-.1,0-.12-.14-.12-.3s0-2.89,0-2.89c-3.42-1-3.22-4.52-3.18-6.39s.39-3.4,1.44-4.43c1.87-1.7,5.73-1.45,5.73-1.45,3.27,0,4.83,1,5.19,1.33C22.47,11.28,23.08,13.75,22.63,17.36Z" transform="translate(-1.91 -1.91)"/><path class="cls-3" d="M16.21,13.29a.23.23,0,0,0,.21.23,1,1,0,0,1,1.1,1.14.22.22,0,0,0,.21.21h0a.22.22,0,0,0,.21-.23,1.47,1.47,0,0,0-1.51-1.56A.23.23,0,0,0,16.21,13.29Z" transform="translate(-1.91 -1.91)"/><path class="cls-3" d="M18.63,15a.22.22,0,0,0,.22.22h0a.21.21,0,0,0,.22-.21,3,3,0,0,0-.77-2.15,3.13,3.13,0,0,0-2.19-1,.21.21,0,0,0-.23.2.22.22,0,0,0,.2.24,2.71,2.71,0,0,1,1.9.82A2.49,2.49,0,0,1,18.63,15Z" transform="translate(-1.91 -1.91)"/><path class="cls-3" d="M15.72,10.78h0a.21.21,0,0,0-.21.22.22.22,0,0,0,.21.22,4,4,0,0,1,2.9,1.14,4.25,4.25,0,0,1,1.17,3.11.22.22,0,0,0,.22.22h0a.22.22,0,0,0,.22-.22,4.6,4.6,0,0,0-1.31-3.42A4.43,4.43,0,0,0,15.72,10.78Z" transform="translate(-1.91 -1.91)"/><path class="cls-3" d="M19.71,18s-.5-.42-.75-.6a9.1,9.1,0,0,0-.8-.51.71.71,0,0,0-.89.13l-.33.4a.61.61,0,0,1-.47.18,4.21,4.21,0,0,1-2.84-2.84.61.61,0,0,1,.18-.47l.4-.33a.69.69,0,0,0,.13-.89,9.1,9.1,0,0,0-.51-.8c-.18-.25-.6-.75-.6-.75a.62.62,0,0,0-.8-.13h0a3.34,3.34,0,0,0-.82.67h0a1.38,1.38,0,0,0-.33.68.34.34,0,0,0,0,.1.92.92,0,0,0,0,.29h0A10.27,10.27,0,0,0,12.18,15a11.47,11.47,0,0,0,1,1.57,8.47,8.47,0,0,0,.63.7l0,0,0,0,0,0,0,0c.22.22.46.43.7.63a11.47,11.47,0,0,0,1.57,1,10.27,10.27,0,0,0,1.87.87h0a.7.7,0,0,0,.29,0h.1a1.38,1.38,0,0,0,.68-.33h0a3.34,3.34,0,0,0,.67-.82h0A.62.62,0,0,0,19.71,18Z" transform="translate(-1.91 -1.91)"/></svg>
@@ -0,0 +1 @@
1
+ <svg id="Слой_1" data-name="Слой 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 27.36 27.36"><defs><style>.cls-1{fill:#44678d;}.cls-2{fill:#fff;}</style></defs><circle class="cls-1" cx="13.68" cy="13.68" r="13.68"/><path class="cls-2" d="M10.31,12.42a12.87,12.87,0,0,0,1.88,3.28,1.4,1.4,0,0,0,.38.35.29.29,0,0,0,.48-.14,3.88,3.88,0,0,0,.17-1c0-.68,0-1.12,0-1.8a.86.86,0,0,0-.81-.92c-.19,0-.21-.2-.09-.36a1.25,1.25,0,0,1,1-.41c.64,0,1.29,0,1.93,0a3.44,3.44,0,0,1,.78.08.7.7,0,0,1,.57.64,2.19,2.19,0,0,1,0,.51c0,.74-.05,1.48-.06,2.21a4.21,4.21,0,0,0,.08.87c.09.39.36.49.63.21a9.73,9.73,0,0,0,.94-1.18,12.05,12.05,0,0,0,1.25-2.42c.17-.43.3-.53.77-.53H22.9a1.76,1.76,0,0,1,.46.06.4.4,0,0,1,.28.52A4.32,4.32,0,0,1,22.86,14c-.54.76-1.11,1.51-1.66,2.26-.07.1-.13.2-.19.3a.63.63,0,0,0,.11.9c.48.49,1,1,1.46,1.47a8.79,8.79,0,0,1,.92,1.19A.68.68,0,0,1,23,21.2c-.39.06-2.34,0-2.44,0a1.88,1.88,0,0,1-1.35-.54c-.41-.39-.79-.83-1.18-1.24l-.38-.35c-.33-.24-.64-.19-.79.19a7.92,7.92,0,0,0-.25,1.25.67.67,0,0,1-.7.65,6.48,6.48,0,0,1-3.54-.67,7.35,7.35,0,0,1-2.35-2A25,25,0,0,1,7.4,14.16c0-.08-.8-1.69-.82-1.77a.45.45,0,0,1,.21-.58c.14-.05,2.64,0,2.68,0A.87.87,0,0,1,10.31,12.42Z" transform="translate(-1.91 -1.91)"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 29.04 29.29"><defs><style>.cls-1{isolation:isolate;}.cls-2{fill:url(#linear-gradient);}.cls-3{opacity:0.01;}.cls-3,.cls-5{mix-blend-mode:multiply;}.cls-4{fill:url(#linear-gradient-2);}.cls-5{opacity:0.06;}.cls-6{fill:#fff;fill-rule:evenodd;}</style><linearGradient id="linear-gradient" x1="14.63" y1="27.36" x2="14.63" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#20b038"/><stop offset="1" stop-color="#60d66a"/></linearGradient><linearGradient id="linear-gradient-2" x1="15.59" y1="24.03" x2="15.59" y2="7.15" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#f9f9f9"/><stop offset="1" stop-color="#fff"/></linearGradient></defs><g class="cls-1"><g id="Слой_1" data-name="Слой 1"><circle class="cls-2" cx="14.63" cy="13.68" r="13.68"/><g id="shape_2" data-name="shape 2"><image class="cls-3" width="121" height="122" transform="translate(0 0.01) scale(0.24)" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHkAAAB6CAYAAACbbvznAAAACXBIWXMAAC4jAAAuIwF4pT92AAAQaUlEQVR4Xu2dbVfjPA+EJ2Wf//+D76V5PoBgMhnJcpqWsjDn+EhxHL/ostwuLeyyrit+9W/rMmrwq++vX8g/QL+Qf4D+jBr8S1qWZeHr9Ye8IVn+pXUqxFv1r2yCbwv5IFB9Znrx3xH8t4I8AHsEekdpgL4L8KeHnIDNgJ4NOgvOrv6ZgT8tZAN3dJ3VVfdHi3f3tW5z/Yywnw7yAG7mj+6x4l61cL5XQU3vPRPsp4EscDOArk13E2h95yh2/uj+xn8G2F8OuYBbAe1a9StVQEd2VPelsL8McgNuZTPfWfWduoAzv7Ib/ytgPxxy8Zrbgdm956z6wBzcCnYH/sZ/JOyHQh5k7wigK66N6yPUhewgZnVVGxT27eIBAB4CuXk0d8FeGm20z7h2UtAzQK/FPRR+XL85d4Zw9w8oEsDOdqFeinsZbLaqCsgI6jK4n4mfxbIsyz1B3zWTG4A7cB3U6t7ZkK8DP7NZgfE/dA/Yd8nkwZurDHIGU/0MdJbVIJspAzyCecXbuFe8jbGS1Q3hxO0B4C5ZfTrkBmC+rsC6ay0dyBVoDmaWeRlcLjF++Gzd5mHdHfSpkJuAtXRgXgC8JPXZZskAbwL6Lg6+ZuEI8BXAKz7BRmHQ3K/TXUGfClk0AlzBfWn4FWgtIMsaZbIeuRngCz5B6z2gDzvuAzgP9GmQizdZR+CObAZaYUN8Jz1OgT3cDDIDZtCv+Bw36kJ6YnD9Qv5pOgXyjYAdSPUd5PC5vyqDM9Crsd0svpBl0Av2mRwlwPLzoZjDEv4Z2Xwz5EnADCWDmxX3jPY5Asxz1aNabZXNkZ0MmQGzv5CvcqCBz6w+BfTNkEkdwFoyoH9MXQbZAT4DcpXRAeYFnxnMhQEzaKe7g74JMmXxLGAGp0D/iM0gc98VYPZnIYevmRxQHOBsPiyta4E+qpsgizSoAUFhV5mbWZfB2rfbcKoRZPbZXrCHHYD5uHZzqubDuiZtPkAfzebDkE0Wh6/FZbCD63wtGszZQGb3R/AjsxVqwHYbmmOQyQHTbAa+IpMPHNMv4mdgs0zWPtx4s1rgg6ebNuRAuzdaXcCqyNiFrlkLDmbzIcgiF/AMtAJ2cLOj2h2JIMvSI3dWrs/YFPw6ueDzdVrBzgAGtnN1R/fh1+dpyMkxHdcKNoPcgc2AX6jvKkPc6ynbkdya1K5Uqg0+gqwvBXydPb8CmH6nPQ35Xbxo3b0KewTVQa5eh90OD1sFrgqKzl/vReC5jQOtfXRhc7nQvXijx4qx25qCnPzgI3wHOMtid0Q7yO41mOWgXuUaxg8txmYF4se1guZ/D0dbhaJgdW5u8/CzU9k8BfldFdwu4Oqo7mSwC9JVbFZYFdyL+PqcBl/bhHTcam4v7/aCLeh4LhSbq6U25MaPLxVIBdu99rpj2u3mDKz6DjbIjgDzP5VW8kP6/CjoOper+DyOgg7LfbWzuQ3ZKAtSJ4tHoEeAFSh/zFeBBtnR/HUt0QfD5rlFeycdXwG/YNt/+BoDBtrZWACakBvvqB3gGdB6RI8AO7ju89wsm0O8Lgc25u+e52e0jrVi24cC5o2pG4phh+V+W9ncgixSsBXoF7IZ6C7gCAZ/ZhtW6xRyWJAFxpv0BZ+ZFqCiD85mBqvXL/QMF51njHWh+wtdRzx0/iVgYA4yB12vHdwMsAPLJQOsGfuaFG6jmeMCwoDDxtwi+Kv4AQ7UTkEzoHiG+1HIWs/PRn+HsnkI2bzhYgidTMjgzmQwA9by19Tdmsmv2IMISPx8+BnouBfPxbpdJjPc6E/nF6CnNIRcyIHNYDvg7jlWBviv8RW0Bo7hdCBHkEf9aEZzprGNexEHhuniFPc7oIfgu5AZgBvUBalzNAdgBb1ScYD/Jv49IfOcWLpBYy16P/pV2FU2K2juM7QCKI/sEnJyVLOfBSjboXxUM2AWw9UsZqhceANcsQW9IgcEbOcfVgGMnmd/JT8sjxGQR4WfuUpfZeaqupmcqQvbHc9hQTbL4Azuf9gCzl6TR5B07ldsX4OzZ1mcBLpxOzHKSufILtWBzDs1rrMymrCC5sAAc1n8H/mv6EEGtsFRMHxUdgDr+lm8ibltNy4aIx2DQS9A/llzCvngu+oRcDd5lkJWwNVx7SA7UAo5bADWZzongFsXA6iecfGpAHP/UVdmdSeTVTpYNmk34WryLosr0M7OZHEoxj8KONb4Cr+u6hmNSSde05qFvIgNX4sDXU1Yg8qAu6BdFocFPKzQgs/MqABn69S1XfB5MmRgGKKDmyUElzKDQ7OQgc9JjxbsditPXMWAV3jACjo7po9A5sDNAo7C43NfWcxcn9X9Q5qBzIOMJusmngHOsjgDXIHNjuoKdMCogrlgfxw7yAz6Ar9Zoj/tZxRHiB/Xq/E3spAbnzrpdVYysHodcqAd8AxsBhlIApDoSj6vJ0Bf3v0A5P5dzdmcrdfFqgKuz3HfKwD7Q5FOJmeQ3KAObjVZYA/WQe6CdYB5wUdA69xjPno86/w5kxlGBk1tBXdKHciVqg0wgsviYFzF7xYFm2Ux+4tcqzgjF+RgO6CBPFbsa7w68St1BLLuuvDd5Kp2gIfBcFexzq8KjGVx8LP7XBhcNR9up/2FXFycr1bvu3lvdBk1IGWD62S5Pmvn5CApaPW7YD8Csb4LW3G7UXFA3T3tz8nFr4ohaxTPD81ArpRNJtsELAfoaEFhN38+qQCtdZ3CoCF+RyOgN+ksyKEqwzsTz6CNCj/PqqBmfzPLAcrG0nmq7cDuxOUmnQH58DHSkIONxDr/raL4akxxr6rPNtMM2GzjV/E7FNtbILvXD77n6mekWaO+WvXPlsLrwOzKxenISWh1C+QZLVK6OiuIP1q3QK528llwZjbEvVW9z9CTy51qlaqXAL5/KK63QA5VE5h9rWJlgdLA3iT53Bzw/Tu4CtSBPjLHmRi1dAZkVbUjnVyQNWDO1zq+3vRpQLr6bCNl8LLCfdj5YLvp7/6e4mzIMxOuAtINrj6v+qhT0MUv8IWdKfzhQvahDJI6IIc9e/pZHfmxptNs9oZGQR190OEK8Db+IjbL6KWwbj4K0n16lM1b5eBmGc7g2Q41k8nZQNng2YSB/YKzgI6ClgXS2WxM187NReejpZqPUweig+1sqSOZXA0wM3gW9Cy4WRZFIFxgo179UAZ5BPSC+pcGMuAaF4WrYPXeIR2BzHKTqCaWBTl8BVoF+YK3nxm7jXGlPqvgKFygHnf02yAZaJXLUFcA325KFvK6riu9fkWnPNlqElldSKFovQb1lawLpi7cfY7rtBjr5qCARyWD7bSi/7FpBntzb+p71+9akU+Q5SbTCTL3HWBccBX06LcbXIDcOhxghjwCmgHW/hbs4+LKEdjO32gEmZUNkgW4UhWA+L5U2FdTFwEJEKoqMKxRFmcwq1+in81iB/hKheevtqUZyKwMdmdwBRziIzYy9Yq3OV7J16CweNNkAeK2/EwF2f0JDAfaZTOrAqq+KzB2qKOQQ12wTprJbtMw3KsUBy2+Tbli36+bpwJmyC57FbCC1iyOMbK1VaAz2NO6FXJIg5lNyAXUweBMdllcAY72fDI40C6Tq6P6jykM2h3TnMkKSzftKIsd7E0sDv1+slEGj+9X10CePSvqoOgCQ9wHf3V39Bw/67LYHdd/APwPe9D8jDuqeQ5Z1lZFwbJVf6dZyCw32EguY6KOIbsAOTEg911oBcz9aCZfpHQzOXstjjXx2Dy30S8LVBt8JuaHIbtdNZoAg+PAuoAs8P0pJAU0CpTK9VFB1tfm7LWY1wqMM7WTxQ50C/ZRyJk6oLVEYOI5DpIGi3Ur5NlMZtD6WhyW5x5jXsXXLK5+t6sCHFoBlN9jOxtypSqoDJPhZVLALkgaYJDVubg5Ochaol02Z4Y7Op55A/D8R5t1qHtD1ozUIHBwtW4GMoO5JZPDMkD1NXvdEc1jOoidLNb5u77fKoosBu4P2Q2u2aNQV7lW6TMMOMtkoDcXPbIVuMKtAHfBMuDZLG5l9b0hqzgYGliGnE2e6/X5K+pMds9rPxlol7kdwAoy++sILpMVbrVZS90TsptM1I2ylJ+NBb4kbRlydtwBfj6aySPYCncGcAbcHdNt0KOjGjgXcpV9ei8LOPuXpK1mYxQNzlHIDrbaeDakgBl09kflsozWNbgTCfDrsToDsgbSBdbtSNdWM9kFnjN6IdvJAKcKNMONArLRL0MJUAowA50d1UO4nSwGboM8Ct4IrBYNXCgLPLdz92Ygh3UF4gOf/UXfmr0KVv8GmTuuwypgYL+GFtzQLZAzZRD1KIuSBTODlEGPe9n4mTQ7dT5sQ25tDCv7w3IKWgFnJ1How+9mMdCHHB3qYrVNBTeDnQV1BMllm2sTz2ZBcc+7Ou6nAlxBHr2rzmLIMWjDDXUhszToI7h6jPG7Ve6D6xQOH2N6lIWqDXj0frXObH3uWM5gu5ON16haAUxlMTAPeUV/d2sgFDL3o/9MCWWbh60rLN4wHWXBzdbmjukKdJXJ3TVNaRYyKwPMwVC4f7E9YqOd+wF/KOtfA+ACMhOc7FldE69NMzg7rrWugutAI+xsFgM9yCvyo04nkx09LoP1mQwyt00Xb6z6oSqzXV8Z4FdjNZMzuPosgwaNGToMGCggy3evd7fhAxFBYKhVhkYWR3t9MxXt1DrIrNlgVGPwutzm1Wx2oLUoYB0rNLsOq04mq1bss9EFYgSO2+nHdQ5y+GcGwfVVAV6xhaPQKrgu+6NPB5rncziLgWOQgTwQF+xB62twtOWP7aqMD+kiO4vO+gqNIDOEKosVcgfuQwADxyEDOegFe7jangOlgOOZLJtnpJB5s4VWY3WeDnQG2fluk7QAn6EZyDpovIFRwFFepf0IMP8buZvNWTuud6AzyOFz8BWMQquy1QGu4O4A35rFwAAyvflasQ8WTygAh1VVgDWLR0esKsvWyg9pUDXgDKUqGXgFW8G9C2BgLpNDPDBn89U33ywiXrM7gGdgu+fUZsoAz4J2xcENX8cE2dMAA/OQV2yDppN1oBVyHM0O8K2QR4Dd3MPntWjGOWAdqGq1wNhTAQMNyMmRrZOIhUSmcr2DvGAPGdhC6ELuAK764iBnJYNWAc3APhQw0IBsxLC5DtiD1kBl2ZtlXqYsQ0eZnGkGdAYy8xXqQwEDTcgmm6vJXLENcixsoXsOcLTvqAvZtXVykPVawTmQWpf1Gbo7YKAJWRTAws/EQFfyXebOQgHGoF2bSgqFfVeq49j14+xd4YaWmTHM/zLDVv0MKl9zH+qP1IHsrp00uxxkvT4Cd+M/AjBwLJOBt4kuYrM22UYIHYHCOquvEejMr+Cy/3C4oalMBtD9e5RhXZ22Z81ACZ3RpwbBZWInUx3cjf9owMAByMAONFBDnD1GO1CcjgIOdUA7m9Vtrr8CbugQZKAEXfnuuntvpFs2jQtCOzsL/0vhhg5DDg1gu+us7lbdC/Kh62eAG7oZcmjwF2i79WfojL470Hd1zwSWdRrkUPGVIeAcACOdMUYWFFv/rHBDp0NmDYDfQ2eOVwbm2cGy7gqZ9QXAT9d3Ast6GORH6YzN9F1hZvrnIP9qrwt+9c/rF/IP0C/kH6BfyD9A/wdtmXqiQVrBzwAAAABJRU5ErkJggg=="/><path class="cls-4" d="M7.19,24,8.37,19.7a8.37,8.37,0,1,1,7.26,4.19h0a8.46,8.46,0,0,1-4-1Zm4.64-2.68.25.15a6.88,6.88,0,0,0,3.54,1h0a6.93,6.93,0,1,0-5.9-3.25l.17.26L9.2,22Z" transform="translate(-0.96 -1.91)"/></g><g id="shape_1" data-name="shape 1"><image class="cls-5" width="111" height="109" transform="translate(1.32 1.57) scale(0.24)" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG8AAABtCAYAAACvDT9rAAAACXBIWXMAAC4jAAAuIwF4pT92AAAKBUlEQVR4Xu2d25KjOBBEk479/0+296Gnxul03SSE2/RwIgiJkhBQxwV2z8Ns9/sdF+fkq5pw8blc8k7MJe/EXPJOzCXvxFzyTswl78Rc8k7Mf9WEn2Lbtq2aw9z/wb82bJ9wz6OiOvwLMn9M3hHCIn6ryLfLe6c05bdJfJu8SWmdY4Zv4LdIPFzeoLSRuRHtGzq7xMPkDUibmde96Na8s0pcLm+RtO4aSnYz5Y2eTeJSeU1x0ZzRODAnq7zhs0hcIm+HNI111umgN+XdZHrjZxC4W15DXCWo2h8lEzck8dMFHikvq7RK2KzArrhOZX4P7E3QgeySNyCO9zsCV8gb7Xv738E9STqQaXkT4iqBR8mrxJ1W4Op/VahkZLFKHsdmEnnHYw3rc2vo/ndw27ZPEzhVeUHVdcVVbdZXOu+4bpv1H8GZhB3E6spTMlGVxOwDYgnUanSrxkErT2NAsNYnVeBw5Q1UXSVsRGRFVlVRrFOl2n8ERxN3AKsrb0TcKoFaRa0KIqaO/4QKHKq8ouoqcZG8PQK1QqKK6+wjabX/CI4kcDHvqLxKXDSu63hU8nh8QyDgD6erwLa8ZtVpTOMjm67l0ZHniYw4lcC2vAaeQOt721cydpS8jtCOQJv3F/twv1NiS95E1Vl/RJzG4LQeKoz7dwA376CCSiCc/e/gG6uwJa9BV5on6SvoQ/q2b3SrTmOjMj9W4Kw8ryKi6uiIrARyq2TiNH7D9/odiSaL+xoDxZ94x2O0lJf8AfrvFOnrFsVVXEeg9TUhnjRPnvW7Ej2B3E8FAji0Ckt5Dp7MSHAkMBLnifQEMirq5sS0b21XIsPiVKCNP3FUFc7Ii9icLYqrqEoei/OSxLIsoTfatz4fp+K+UAv0xOn1sNAnVlfhHnlRJfB4V2AkMxLIaHWxNNs3gTzf+izOZOrGROJY2lsEpvIG33deXBMfCVRxmTw+p4rjJHri+Bjujz4+I3Eq0MafWCVwtPI8WVWSM3GexOgRymsxnkB9ZBqVyFmJkUA4+9/BBQJH5RleEr3xjrgv+OK89x+vCfjiOIGZuEgkSzxU4F5m5XXoistkVvKAWKAl3o7NxAGPdbx3YCVxSuDe6jtCHidXE52JZHEqVwXaWioOeH5ksqTNiTGcxJXfRKflVBwhT+GkZfsqrVt9KtASllWe4o2rOJPJm1IJfJG5p/r2yOMEaswb0/Hu5j1adf3RytPNE6viqsozKoHL2COvokq4zdHWhEWVp8cAz9VniRqpvIiZ9x+Qi3sROVt9I/Ky5EfjHiqq2vRxyscy3iONpem6XfiDMVKF5SNzLyPyjmJL2kiizuVE3Wn/RvO9hHckeo9P74OjeOK0fUyeqL4ReXbSKtZBj4kE8ri38TjgV58+sjyqe1BxWn3e8ZG4ZYzIq5gVqbBAFRXFgLz64PRHUXEsMFsveny+yBytvpXy9lIlVMWxQBtXgZZkIH60jeI9PnkdPY8nbgl75HUeo/z40nmdGBCL8hKnybFviEC8vsY7yeV3KaiNcmJzMrHfgYHq2yOvgm8ku5hIcEQkUedo9XEVZngyvYpXeZ44htddUoFHycs+gdx6ifLmeUTVp3D1eQLveH608riOqTh+fPI1ZGJU3LTIWXnZp0wrLhNyx+ucbF5UZdk+xzXZFjP0Gky8zjN0LTsuEjItyiN9jDjP3pETR8dGsirRPNdDk+hVibW66Rydr2tFG6T1xg3dfwzU/wgOYL7yFE6ofbq8C1BJKquz2bp6Tia6hiix+ti0Y3lcY9798XmjDxnPi/ZbdF7gFVFlZAJ0/FbMz9YxdJ+Tm1WDt3WqzlsPTqtE8WH2yos+LZnAKO7J1LYS6V2PJpr7s1u2BvA6x1Bxu0SW8pL3XiTO8ETpvoq5IRY2IpD3FU2mJwRBqzEPb0wlLuGId56x/YnzRXvitqSvf8Xgvydmv930nB52Lt5XUboB9ZzofEN0fqyvkKeCNF5Viydrc2Is147p/vjWyszw7kXpzqnOtYtZeSwm+pTzxY+I8/5mqC3wLE5/b0XXxdeXJbZz/o7AEYZlt+Td7/d747dHlLBO9UUCubW1GE6q/iXESwSfE/DnZPEu/AGK1hqWpbTkBbAsFafzrDVRSkeUh1cZXuUBr9fhbTxP+x9HW15SfSrRg6sP1GehLM6O8frA4zirNpXnHQPkAnk86nfFevOjOdO05TVgid6Ytp5AplN5wEOinZ83UJudO5M5Km6W4TX3yrOEsbjOpy0SxmSVY30Wp38NAfI1+Bq4zQTy8RXdeS7VzwRgUF7ji0sm0STbmH1T9CTqI1QxWdy3c/OjtCNPBd6ceCTU297GkLwAS5qK895ThoqzPictg+fyufXxaXA/EqDSPHEsKIszOr6MYXkD1VddrCXJfqdFc7zNqzrvvQc8izM8AVp9mbzo3lSgJzLbH2JYXgAL674DLV49PhVOoHdO3YDndVQcEFddVySvFYkzdgljpuQF1ReJ86pQY5YorULvHFXV2RcXOK2hAnnL3n8dkbx+hI5X812m5DXxZPIYw+JYoFZMRxyfj6tP0WSzOE+iN+ZJ077OMUJhnW+awA55zerjtoLFacWMiosemUyWZE+eSusIVDp5aDMtDwgF/h3GnEATkUnsiKvkAX7SI0mZwGwtve9qv80ueQGWRO5rrCKT2BXnydNr8BKvFZWJjDZlmTBmt7zi8Rn1uxfvSWSB/MGo5HnXqG20dQRGaxgdqe33HbBAXgJL4/1IYCRBxbFAG1dZHXnAfoGRKKYSOM0SeYM/3DOBHp44T6JucFqPWYHdjdfm/su9j1QdsEgeEAq0xHJ/VGAkJ9vgtIZ3zhGB3c0IZe1lmTxgWmAGH6uxUXG6juGJszaS0hGXCXy579GqAxbLA4YFgvoqU8WxNN3PxHmVB7wmsJKnMW9OJmlYTsVyeQkqEHgVF1VjJJL7XXkRkbyon+17rfFyfzNVBxwkL/kCE0nIxCl6DPeRtBVV8iuZ0THcLmXofzQZpfgGymNev9NWc7RfUSV/Rhgn+CXZs1UHHCwPGBLI+7MyudV+l66ETE5LHPDh8owBiZm4mRjjxbwEVMnvSNJ1l1Yd8EZ5wJBA3q/EZn1vv6ISFvWzKlsuDjjoC0tE8ZcYuxkbv//pc3zmhm2dDlnSO2OltJW8tfKYogqBfjV1K606n5eISkZX7vPAoqT/mDygJRAYExfFsjiQV0glpdp/HlyY8B+VZyyQmMU6Y8A+gVHsecLiZH+EPGNSYhWvxpgRgVX8MeGgJH+UPKMpEVgjLKJKTDV+mDTjI+UZAxKB/bI6tJJ1tDTjo+UZgxKBdSKHkvMuacYp5BkTEj28NXYl4d3SjFPJYxaJ3MVPSTNOK495p8ifFsb8Cnkeq4R+kizl18r7F/jCxWm55J2YS96JueSdmEveibnknZj/Afn/Rqf5onvyAAAAAElFTkSuQmCC"/><path class="cls-6" d="M13.53,12c-.15-.35-.32-.36-.47-.36h-.4a.75.75,0,0,0-.55.26,2.33,2.33,0,0,0-.74,1.75,4,4,0,0,0,.86,2.16A8.51,8.51,0,0,0,15.8,19c1.77.69,2.12.55,2.51.52a2.13,2.13,0,0,0,1.41-1,1.79,1.79,0,0,0,.12-1c-.05-.09-.19-.14-.4-.24s-1.24-.61-1.43-.68-.33-.11-.47.1-.54.68-.66.82-.24.16-.45,0a5.45,5.45,0,0,1-1.68-1,6.2,6.2,0,0,1-1.17-1.45.31.31,0,0,1,.09-.43,4.28,4.28,0,0,0,.32-.37,1.48,1.48,0,0,0,.21-.34.4.4,0,0,0,0-.37C14.13,13.46,13.72,12.43,13.53,12Z" transform="translate(-0.96 -1.91)"/></g></g></g></svg>
package/dist/sw.js CHANGED
@@ -1,2 +1,2 @@
1
- if(!self.define){const e=e=>{"require"!==e&&(e+=".js");let r=Promise.resolve();return t[e]||(r=new Promise(async r=>{if("document"in self){const t=document.createElement("script");t.src=e,document.head.appendChild(t),t.onload=r}else importScripts(e),r()})),r.then(()=>{if(!t[e])throw new Error(`Module ${e} didn’t register its module`);return t[e]})},r=(r,t)=>{Promise.all(r.map(e)).then(e=>t(1===e.length?e[0]:e))},t={require:Promise.resolve(r)};self.define=(r,s,o)=>{t[r]||(t[r]=Promise.resolve().then(()=>{let t={};const n={uri:location.origin+r.slice(1)};return Promise.all(s.map(r=>{switch(r){case"exports":return t;case"module":return n;default:return e(r)}})).then(e=>{const r=o(...e);return t.default||(t.default=r),t})}))}}define("./sw.js",["./workbox-80efdfd1"],(function(e){"use strict";e.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"29fc0c7c.js",revision:"26bd1643253d085d61da05148806ae0e"},{url:"templates/components-body.html",revision:"cbff3c3d6e29df71d5b35c2e77a6850b"},{url:"templates/components-head.html",revision:"210b5497385957392d6e5af7ef704a33"}],{}),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("/index.html"))),e.registerRoute("polyfills/*.js",new e.CacheFirst,"GET")}));
1
+ if(!self.define){const e=e=>{"require"!==e&&(e+=".js");let r=Promise.resolve();return t[e]||(r=new Promise(async r=>{if("document"in self){const t=document.createElement("script");t.src=e,document.head.appendChild(t),t.onload=r}else importScripts(e),r()})),r.then(()=>{if(!t[e])throw new Error(`Module ${e} didn’t register its module`);return t[e]})},r=(r,t)=>{Promise.all(r.map(e)).then(e=>t(1===e.length?e[0]:e))},t={require:Promise.resolve(r)};self.define=(r,s,o)=>{t[r]||(t[r]=Promise.resolve().then(()=>{let t={};const n={uri:location.origin+r.slice(1)};return Promise.all(s.map(r=>{switch(r){case"exports":return t;case"module":return n;default:return e(r)}})).then(e=>{const r=o(...e);return t.default||(t.default=r),t})}))}}define("./sw.js",["./workbox-80efdfd1"],(function(e){"use strict";e.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"d0cc86be.js",revision:"cfdeb6f6bd137df70602742b402e2cbd"},{url:"templates/components-body.html",revision:"58fe7559f70dd487ca4929653f2078f5"},{url:"templates/components-head.html",revision:"9ea4b183bbead2eead6e5450d64fd6c4"}],{}),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("/index.html"))),e.registerRoute("polyfills/*.js",new e.CacheFirst,"GET")}));
2
2
  //# sourceMappingURL=sw.js.map
package/dist/sw.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sw.js","sources":["../../../../../tmp/b30126a5353b4b4d3682e1729b4da03e/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-routing/registerRoute.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {skipWaiting as workbox_core_skipWaiting} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-core/skipWaiting.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {NavigationRoute as workbox_routing_NavigationRoute} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-routing/NavigationRoute.mjs';\nimport {createHandlerBoundToURL as workbox_precaching_createHandlerBoundToURL} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-precaching/createHandlerBoundToURL.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nworkbox_core_skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"29fc0c7c.js\",\n \"revision\": \"26bd1643253d085d61da05148806ae0e\"\n },\n {\n \"url\": \"templates/components-body.html\",\n \"revision\": \"cbff3c3d6e29df71d5b35c2e77a6850b\"\n },\n {\n \"url\": \"templates/components-head.html\",\n \"revision\": \"210b5497385957392d6e5af7ef704a33\"\n }\n], {});\n\nworkbox_routing_registerRoute(new workbox_routing_NavigationRoute(workbox_precaching_createHandlerBoundToURL(\"/index.html\")));\n\n\nworkbox_routing_registerRoute(\"polyfills/*.js\", new workbox_strategies_CacheFirst(), 'GET');\n\n\n\n\n"],"names":["workbox_routing_NavigationRoute","workbox_precaching_createHandlerBoundToURL","workbox_strategies_CacheFirst"],"mappings":"k1BAmCoC,CAClC,KACS,uBACK,oCAEd,KACS,0CACK,oCAEd,KACS,0CACK,qCAEb,oBAE2B,IAAIA,kBAAgCC,0BAA2C,iCAG/E,iBAAkB,IAAIC,aAAiC"}
1
+ {"version":3,"file":"sw.js","sources":["../../../../../tmp/cf35ae6e00bc1e19a8f56baa40a2858a/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-routing/registerRoute.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {skipWaiting as workbox_core_skipWaiting} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-core/skipWaiting.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {NavigationRoute as workbox_routing_NavigationRoute} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-routing/NavigationRoute.mjs';\nimport {createHandlerBoundToURL as workbox_precaching_createHandlerBoundToURL} from '/home/runner/work/temba-components/temba-components/node_modules/workbox-precaching/createHandlerBoundToURL.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nworkbox_core_skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"d0cc86be.js\",\n \"revision\": \"cfdeb6f6bd137df70602742b402e2cbd\"\n },\n {\n \"url\": \"templates/components-body.html\",\n \"revision\": \"58fe7559f70dd487ca4929653f2078f5\"\n },\n {\n \"url\": \"templates/components-head.html\",\n \"revision\": \"9ea4b183bbead2eead6e5450d64fd6c4\"\n }\n], {});\n\nworkbox_routing_registerRoute(new workbox_routing_NavigationRoute(workbox_precaching_createHandlerBoundToURL(\"/index.html\")));\n\n\nworkbox_routing_registerRoute(\"polyfills/*.js\", new workbox_strategies_CacheFirst(), 'GET');\n\n\n\n\n"],"names":["workbox_routing_NavigationRoute","workbox_precaching_createHandlerBoundToURL","workbox_strategies_CacheFirst"],"mappings":"k1BAmCoC,CAClC,KACS,uBACK,oCAEd,KACS,0CACK,oCAEd,KACS,0CACK,qCAEb,oBAE2B,IAAIA,kBAAgCC,0BAA2C,iCAG/E,iBAAkB,IAAIC,aAAiC"}
@@ -1 +1 @@
1
- <script type="module" src="{{STATIC_URL}}@nyaruka/temba-components/dist/29fc0c7c.js"></script><script>window.TEMBA_COMPONENTS_VERSION="0.26.6"</script>
1
+ <script type="module" src="{{STATIC_URL}}@nyaruka/temba-components/dist/d0cc86be.js"></script><script>window.TEMBA_COMPONENTS_VERSION="0.26.9"</script>
@@ -1 +1 @@
1
- <link rel="modulepreload" href="{{STATIC_URL}}@nyaruka/temba-components/dist/29fc0c7c.js" crossorigin="anonymous">
1
+ <link rel="modulepreload" href="{{STATIC_URL}}@nyaruka/temba-components/dist/d0cc86be.js" crossorigin="anonymous">
@@ -1 +1 @@
1
- {"version":3,"file":"RapidElement.js","sourceRoot":"","sources":["../../src/RapidElement.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement } from 'lit';\nimport { CustomEventType } from './interfaces';\n\nexport interface EventHandler {\n event: string;\n method: EventListener;\n isDocument?: boolean;\n}\n\nexport class RapidElement extends LitElement {\n private eles: { [selector: string]: HTMLDivElement } = {};\n\n public getEventHandlers(): EventHandler[] {\n return [];\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n for (const handler of this.getEventHandlers()) {\n if (handler.isDocument) {\n document.addEventListener(handler.event, handler.method.bind(this));\n } else {\n this.addEventListener(handler.event, handler.method.bind(this));\n }\n }\n }\n\n disconnectedCallback() {\n for (const handler of this.getEventHandlers()) {\n if (handler.isDocument) {\n document.removeEventListener(handler.event, handler.method);\n } else {\n this.removeEventListener(handler.event, handler.method);\n }\n }\n super.disconnectedCallback();\n }\n\n public fireEvent(type: string): any {\n return this.dispatchEvent(\n new Event(type, {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n public fireCustomEvent(type: CustomEventType, detail: any = {}): any {\n const event = new CustomEvent(type, {\n detail,\n bubbles: true,\n composed: true,\n });\n\n return this.dispatchEvent(event);\n }\n\n public dispatchEvent(event: any): any {\n super.dispatchEvent(event);\n const ele = event.target;\n if (ele) {\n // lookup events with - prefix and try to invoke them\n const eventFire = (ele as any)['-' + event.type];\n if (eventFire) {\n return eventFire(event);\n } else {\n const func = new Function(\n 'event',\n `with(document) {\n with(this) {\n let handler = ${ele.getAttribute('-' + event.type)};\n if(typeof handler === 'function') { \n handler(event) ;\n }\n }\n }`\n );\n return func.call(ele, event);\n }\n }\n }\n\n public closestElement(selector: string, base: Element = this) {\n function __closestFrom(el: Element | Window | Document): Element {\n if (!el || el === document || el === window) return null;\n if ((el as any).assignedSlot) el = (el as any).assignedSlot;\n const found = (el as Element).closest(selector);\n return found\n ? found\n : __closestFrom(((el as Element).getRootNode() as ShadowRoot).host);\n }\n return __closestFrom(base);\n }\n\n public getDiv(selector: string) {\n let ele = this.eles[selector];\n if (ele) {\n return ele;\n }\n\n ele = this.shadowRoot.querySelector(selector);\n if (ele) {\n this.eles[selector] = ele;\n }\n return ele;\n }\n}\n"]}
1
+ {"version":3,"file":"RapidElement.js","sourceRoot":"","sources":["../../src/RapidElement.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement } from 'lit';\nimport { CustomEventType } from './interfaces';\n\nexport interface EventHandler {\n event: string;\n method: EventListener;\n isDocument?: boolean;\n}\n\nexport class RapidElement extends LitElement {\n private eles: { [selector: string]: HTMLDivElement } = {};\n public getEventHandlers(): EventHandler[] {\n return [];\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n for (const handler of this.getEventHandlers()) {\n if (handler.isDocument) {\n document.addEventListener(handler.event, handler.method.bind(this));\n } else {\n this.addEventListener(handler.event, handler.method.bind(this));\n }\n }\n }\n\n disconnectedCallback() {\n for (const handler of this.getEventHandlers()) {\n if (handler.isDocument) {\n document.removeEventListener(handler.event, handler.method);\n } else {\n this.removeEventListener(handler.event, handler.method);\n }\n }\n super.disconnectedCallback();\n }\n\n public fireEvent(type: string): any {\n return this.dispatchEvent(\n new Event(type, {\n bubbles: true,\n composed: true,\n })\n );\n }\n\n public fireCustomEvent(type: CustomEventType, detail: any = {}): any {\n const event = new CustomEvent(type, {\n detail,\n bubbles: true,\n composed: true,\n });\n\n return this.dispatchEvent(event);\n }\n\n public dispatchEvent(event: any): any {\n super.dispatchEvent(event);\n const ele = event.target;\n if (ele) {\n // lookup events with - prefix and try to invoke them\n const eventFire = (ele as any)['-' + event.type];\n if (eventFire) {\n return eventFire(event);\n } else {\n const func = new Function(\n 'event',\n `with(document) {\n with(this) {\n let handler = ${ele.getAttribute('-' + event.type)};\n if(typeof handler === 'function') { \n handler(event) ;\n }\n }\n }`\n );\n return func.call(ele, event);\n }\n }\n }\n\n public closestElement(selector: string, base: Element = this) {\n function __closestFrom(el: Element | Window | Document): Element {\n if (!el || el === document || el === window) return null;\n if ((el as any).assignedSlot) el = (el as any).assignedSlot;\n const found = (el as Element).closest(selector);\n return found\n ? found\n : __closestFrom(((el as Element).getRootNode() as ShadowRoot).host);\n }\n return __closestFrom(base);\n }\n\n public getDiv(selector: string) {\n let ele = this.eles[selector];\n if (ele) {\n return ele;\n }\n\n ele = this.shadowRoot.querySelector(selector);\n if (ele) {\n this.eles[selector] = ele;\n }\n return ele;\n }\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { __decorate } from "tslib";
2
+ import { property } from 'lit/decorators';
3
+ import { CustomEventType } from './interfaces';
4
+ import { RapidElement } from './RapidElement';
5
+ export class RefreshElement extends RapidElement {
6
+ updated(properties) {
7
+ if (properties.has('endpoint')) {
8
+ this.refresh();
9
+ }
10
+ }
11
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
12
+ refreshComplete(results) {
13
+ // noop
14
+ }
15
+ refresh(force = false) {
16
+ const store = document.querySelector('temba-store');
17
+ if (store) {
18
+ store.getResults(this.endpoint, { force }).then((results) => {
19
+ this.fireCustomEvent(CustomEventType.Refreshed, results);
20
+ this.refreshComplete(results);
21
+ });
22
+ }
23
+ }
24
+ }
25
+ __decorate([
26
+ property({ type: String })
27
+ ], RefreshElement.prototype, "endpoint", void 0);
28
+ //# sourceMappingURL=RefreshElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RefreshElement.js","sourceRoot":"","sources":["../../src/RefreshElement.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,MAAM,OAAO,cAAe,SAAQ,YAAY;IAIpC,OAAO,CACf,UAA6D;QAE7D,IAAI,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;SAChB;IACH,CAAC;IAED,6DAA6D;IACnD,eAAe,CAAC,OAAY;QACpC,OAAO;IACT,CAAC;IAEM,OAAO,CAAC,KAAK,GAAG,KAAK;QAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAU,CAAC;QAC7D,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAc,EAAE,EAAE;gBACjE,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACzD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;CACF;AAxBC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDACV","sourcesContent":["import { PropertyValueMap } from 'lit';\nimport { property } from 'lit/decorators';\nimport { CustomEventType } from './interfaces';\nimport { RapidElement } from './RapidElement';\nimport { Store } from './store/Store';\n\nexport class RefreshElement extends RapidElement {\n @property({ type: String })\n endpoint: string;\n\n protected updated(\n properties: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n if (properties.has('endpoint')) {\n this.refresh();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected refreshComplete(results: any) {\n // noop\n }\n\n public refresh(force = false) {\n const store = document.querySelector('temba-store') as Store;\n if (store) {\n store.getResults(this.endpoint, { force }).then((results: any[]) => {\n this.fireCustomEvent(CustomEventType.Refreshed, results);\n this.refreshComplete(results);\n });\n }\n }\n}\n"]}
@@ -192,6 +192,7 @@ export class Button extends LitElement {
192
192
  'active-button': this.active,
193
193
  'attention-button': this.attention,
194
194
  'destructive-button': this.destructive,
195
+ 'light-button': this.light,
195
196
  })}"
196
197
  tabindex="0"
197
198
  @mousedown=${this.handleMouseDown}
@@ -222,6 +223,9 @@ __decorate([
222
223
  __decorate([
223
224
  property({ type: Boolean })
224
225
  ], Button.prototype, "destructive", void 0);
226
+ __decorate([
227
+ property({ type: Boolean })
228
+ ], Button.prototype, "light", void 0);
225
229
  __decorate([
226
230
  property()
227
231
  ], Button.prototype, "name", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../src/button/Button.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, TemplateResult, html, css } from 'lit';\nimport { getClasses } from '../utils';\n\nimport { property } from 'lit/decorators';\n\nexport class Button extends LitElement {\n static get styles() {\n return css`\n :host {\n display: inline-block;\n font-family: var(--font-family);\n font-weight: 400;\n }\n\n .v-2.button-container {\n background: var(--button-bg);\n background-image: var(--button-bg-img);\n color: var(--button-text);\n box-shadow: var(--button-shadow);\n transition: all 100ms ease-in;\n }\n\n .button-container {\n color: #fff;\n cursor: pointer;\n display: block;\n border-radius: var(--curvature);\n outline: none;\n transition: background ease-in 200ms;\n user-select: none;\n -webkit-user-select: none;\n text-align: center;\n }\n\n .button-name {\n white-space: nowrap;\n }\n\n .secondary-button:hover .button-mask {\n border: 1px solid var(--color-button-secondary);\n }\n\n .button-mask:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .button-container:focus {\n outline: none;\n margin: 0;\n }\n\n .button-container:focus {\n box-shadow: var(--widget-box-shadow-focused);\n }\n\n .button-container.secondary-button:focus .button-mask {\n background: transparent;\n }\n\n .button-mask {\n padding: var(--button-y) var(--button-x);\n border-radius: var(--curvature);\n border: 1px solid transparent;\n transition: all ease-in 200ms;\n background: var(--button-mask);\n }\n\n .button-container.disabled-button {\n background: rgba(0, 0, 0, 0.05);\n color: rgba(255, 255, 255, 0.45);\n cursor: default;\n }\n\n .button-container.disabled-button .button-mask {\n box-shadow: 0 0 0px 1px var(--color-button-disabled);\n }\n\n .button-container.disabled-button:hover .button-mask {\n box-shadow: 0 0 0px 1px var(--color-button-disabled);\n background: rgba(0, 0, 0, 0.05);\n }\n\n .button-container.active-button .button-mask {\n }\n\n .secondary-button.active-button {\n background: transparent;\n color: var(--color-text);\n }\n\n .secondary-button.active-button .button-mask {\n border: none;\n }\n\n .button-container.secondary-button.active-button:focus .button-mask {\n background: transparent;\n box-shadow: none;\n }\n\n .primary-button {\n background: var(--color-button-primary);\n color: var(--color-button-primary-text);\n }\n\n .light-button {\n background: var(--color-button-light);\n color: var(--color-button-light-text);\n }\n\n .attention-button {\n background: var(--color-button-attention);\n color: var(--color-button-primary-text);\n }\n\n .secondary-button {\n background: transparent;\n color: var(--color-text);\n font-weight: 300;\n }\n\n .destructive-button {\n background: var(--color-button-destructive);\n color: var(--color-button-destructive-text);\n }\n\n .button-mask.disabled-button {\n background: rgba(0, 0, 0, 0.1);\n }\n\n .secondary-button .button-mask:hover {\n background: transparent;\n }\n\n .submit-animation {\n padding: 1px 4px;\n }\n\n .submit-animation temba-loading {\n margin-bottom: -3px;\n line-height: normal;\n }\n `;\n }\n\n @property({ type: Boolean })\n primary: boolean;\n\n @property({ type: Boolean })\n secondary: boolean;\n\n @property({ type: Boolean })\n attention: boolean;\n\n @property({ type: Number })\n v = 1;\n\n @property({ type: Boolean })\n destructive: boolean;\n\n @property()\n name: string;\n\n @property({ type: Boolean })\n disabled: boolean;\n\n @property({ type: Boolean })\n submitting: boolean;\n\n @property({ type: Boolean })\n active: boolean;\n\n @property({ type: String })\n href: string;\n\n private handleClick(evt: MouseEvent) {\n if (this.disabled) {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n if (this.href && !this.disabled) {\n this.ownerDocument.location.href = this.href;\n evt.preventDefault();\n evt.stopPropagation();\n }\n }\n\n private handleKeyUp(event: KeyboardEvent): void {\n this.active = false;\n if (event.key === 'Enter') {\n this.click();\n }\n }\n\n private handleMouseDown(): void {\n if (!this.disabled && !this.submitting) {\n this.active = true;\n this.classList.add('active');\n }\n }\n\n private handleMouseUp(): void {\n this.active = false;\n this.classList.remove('active');\n }\n\n public render(): TemplateResult {\n const buttonName = this.submitting\n ? html`<div class=\"submit-animation\">\n <temba-loading units=\"3\" size=\"8\" color=\"#eee\"></temba-loading>\n </div>`\n : this.name;\n\n return html`\n <div\n class=\"button-container \n v-${this.v}\n ${getClasses({\n 'primary-button':\n this.primary ||\n (!this.primary &&\n !this.secondary &&\n !this.attention &&\n this.v == 1),\n 'secondary-button': this.secondary,\n 'disabled-button': this.disabled,\n 'active-button': this.active,\n 'attention-button': this.attention,\n 'destructive-button': this.destructive,\n })}\"\n tabindex=\"0\"\n @mousedown=${this.handleMouseDown}\n @mouseup=${this.handleMouseUp}\n @mouseleave=${this.handleMouseUp}\n @keyup=${this.handleKeyUp}\n @click=${this.handleClick}\n >\n <div class=\"button-mask\">\n <div class=\"button-name\">${buttonName}</div>\n </div>\n </div>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../src/button/Button.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, TemplateResult, html, css } from 'lit';\nimport { getClasses } from '../utils';\n\nimport { property } from 'lit/decorators';\n\nexport class Button extends LitElement {\n static get styles() {\n return css`\n :host {\n display: inline-block;\n font-family: var(--font-family);\n font-weight: 400;\n }\n\n .v-2.button-container {\n background: var(--button-bg);\n background-image: var(--button-bg-img);\n color: var(--button-text);\n box-shadow: var(--button-shadow);\n transition: all 100ms ease-in;\n }\n\n .button-container {\n color: #fff;\n cursor: pointer;\n display: block;\n border-radius: var(--curvature);\n outline: none;\n transition: background ease-in 200ms;\n user-select: none;\n -webkit-user-select: none;\n text-align: center;\n }\n\n .button-name {\n white-space: nowrap;\n }\n\n .secondary-button:hover .button-mask {\n border: 1px solid var(--color-button-secondary);\n }\n\n .button-mask:hover {\n background: rgba(0, 0, 0, 0.05);\n }\n\n .button-container:focus {\n outline: none;\n margin: 0;\n }\n\n .button-container:focus {\n box-shadow: var(--widget-box-shadow-focused);\n }\n\n .button-container.secondary-button:focus .button-mask {\n background: transparent;\n }\n\n .button-mask {\n padding: var(--button-y) var(--button-x);\n border-radius: var(--curvature);\n border: 1px solid transparent;\n transition: all ease-in 200ms;\n background: var(--button-mask);\n }\n\n .button-container.disabled-button {\n background: rgba(0, 0, 0, 0.05);\n color: rgba(255, 255, 255, 0.45);\n cursor: default;\n }\n\n .button-container.disabled-button .button-mask {\n box-shadow: 0 0 0px 1px var(--color-button-disabled);\n }\n\n .button-container.disabled-button:hover .button-mask {\n box-shadow: 0 0 0px 1px var(--color-button-disabled);\n background: rgba(0, 0, 0, 0.05);\n }\n\n .button-container.active-button .button-mask {\n }\n\n .secondary-button.active-button {\n background: transparent;\n color: var(--color-text);\n }\n\n .secondary-button.active-button .button-mask {\n border: none;\n }\n\n .button-container.secondary-button.active-button:focus .button-mask {\n background: transparent;\n box-shadow: none;\n }\n\n .primary-button {\n background: var(--color-button-primary);\n color: var(--color-button-primary-text);\n }\n\n .light-button {\n background: var(--color-button-light);\n color: var(--color-button-light-text);\n }\n\n .attention-button {\n background: var(--color-button-attention);\n color: var(--color-button-primary-text);\n }\n\n .secondary-button {\n background: transparent;\n color: var(--color-text);\n font-weight: 300;\n }\n\n .destructive-button {\n background: var(--color-button-destructive);\n color: var(--color-button-destructive-text);\n }\n\n .button-mask.disabled-button {\n background: rgba(0, 0, 0, 0.1);\n }\n\n .secondary-button .button-mask:hover {\n background: transparent;\n }\n\n .submit-animation {\n padding: 1px 4px;\n }\n\n .submit-animation temba-loading {\n margin-bottom: -3px;\n line-height: normal;\n }\n `;\n }\n\n @property({ type: Boolean })\n primary: boolean;\n\n @property({ type: Boolean })\n secondary: boolean;\n\n @property({ type: Boolean })\n attention: boolean;\n\n @property({ type: Number })\n v = 1;\n\n @property({ type: Boolean })\n destructive: boolean;\n\n @property({ type: Boolean })\n light: boolean;\n\n @property()\n name: string;\n\n @property({ type: Boolean })\n disabled: boolean;\n\n @property({ type: Boolean })\n submitting: boolean;\n\n @property({ type: Boolean })\n active: boolean;\n\n @property({ type: String })\n href: string;\n\n private handleClick(evt: MouseEvent) {\n if (this.disabled) {\n evt.preventDefault();\n evt.stopPropagation();\n }\n\n if (this.href && !this.disabled) {\n this.ownerDocument.location.href = this.href;\n evt.preventDefault();\n evt.stopPropagation();\n }\n }\n\n private handleKeyUp(event: KeyboardEvent): void {\n this.active = false;\n if (event.key === 'Enter') {\n this.click();\n }\n }\n\n private handleMouseDown(): void {\n if (!this.disabled && !this.submitting) {\n this.active = true;\n this.classList.add('active');\n }\n }\n\n private handleMouseUp(): void {\n this.active = false;\n this.classList.remove('active');\n }\n\n public render(): TemplateResult {\n const buttonName = this.submitting\n ? html`<div class=\"submit-animation\">\n <temba-loading units=\"3\" size=\"8\" color=\"#eee\"></temba-loading>\n </div>`\n : this.name;\n\n return html`\n <div\n class=\"button-container \n v-${this.v}\n ${getClasses({\n 'primary-button':\n this.primary ||\n (!this.primary &&\n !this.secondary &&\n !this.attention &&\n this.v == 1),\n 'secondary-button': this.secondary,\n 'disabled-button': this.disabled,\n 'active-button': this.active,\n 'attention-button': this.attention,\n 'destructive-button': this.destructive,\n 'light-button': this.light,\n })}\"\n tabindex=\"0\"\n @mousedown=${this.handleMouseDown}\n @mouseup=${this.handleMouseUp}\n @mouseleave=${this.handleMouseUp}\n @keyup=${this.handleKeyUp}\n @click=${this.handleClick}\n >\n <div class=\"button-mask\">\n <div class=\"button-name\">${buttonName}</div>\n </div>\n </div>\n `;\n }\n}\n"]}
@@ -1,12 +1,11 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { css, html } from 'lit';
3
3
  import { property } from 'lit/decorators';
4
- import { RapidElement } from '../RapidElement';
5
4
  import { CustomEventType } from '../interfaces';
6
5
  import { COOKIE_KEYS, getCookieBoolean, postJSON, setCookie } from '../utils';
7
- import { fetchContact } from './helpers';
6
+ import { ContactStoreElement } from './ContactStoreElement';
8
7
  const DEFAULT_REFRESH = 10000;
9
- export class ContactChat extends RapidElement {
8
+ export class ContactChat extends ContactStoreElement {
10
9
  constructor() {
11
10
  super();
12
11
  this.contactsEndpoint = '/api/v2/contacts.json';
@@ -202,14 +201,10 @@ export class ContactChat extends RapidElement {
202
201
  }
203
202
  updated(changedProperties) {
204
203
  super.updated(changedProperties);
205
- // we were provided a uuid, fetch our contact details
206
- if (changedProperties.has('contactUUID') && this.contactUUID) {
207
- fetchContact(this.contactsEndpoint + '?uuid=' + this.contactUUID).then(contact => {
208
- this.currentContact = contact;
209
- });
210
- }
211
204
  // if we don't have an endpoint infer one
212
- if (changedProperties.has('currentContact')) {
205
+ if (changedProperties.has('data') ||
206
+ changedProperties.has('currentContact')) {
207
+ this.currentContact = this.data;
213
208
  // focus our completion on load
214
209
  const prevContact = changedProperties.get('contact');
215
210
  if (!prevContact ||
@@ -413,9 +408,6 @@ export class ContactChat extends RapidElement {
413
408
  `;
414
409
  }
415
410
  }
416
- __decorate([
417
- property({ type: String, attribute: 'contact' })
418
- ], ContactChat.prototype, "contactUUID", void 0);
419
411
  __decorate([
420
412
  property({ type: String, attribute: 'ticket' })
421
413
  ], ContactChat.prototype, "ticketUUID", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"ContactChat.js","sourceRoot":"","sources":["../../../src/contacts/ContactChat.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators';\nimport { RapidElement } from '../RapidElement';\nimport { Contact, CustomEventType, Ticket } from '../interfaces';\nimport { COOKIE_KEYS, getCookieBoolean, postJSON, setCookie } from '../utils';\nimport { TextInput } from '../textinput/TextInput';\nimport { Completion } from '../completion/Completion';\nimport { ContactHistory } from './ContactHistory';\nimport { Modax } from '../dialog/Modax';\nimport { fetchContact } from './helpers';\n\nconst DEFAULT_REFRESH = 10000;\n\nexport class ContactChat extends RapidElement {\n public static get styles() {\n return css`\n .left-pane {\n box-shadow: -13px 10px 7px 14px rgba(0, 0, 0, 0);\n transition: box-shadow 600ms linear;\n }\n\n .left-pane.open {\n z-index: 1000;\n }\n\n :host {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n min-height: 0;\n border-radius: var(--curvature);\n }\n\n .chat-wrapper {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n }\n\n temba-contact-history {\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .chatbox {\n padding: 1em;\n background: #f2f2f2;\n border-top: 3px solid #e1e1e1;\n display: flex;\n flex-direction: column;\n z-index: 3;\n border-bottom-left-radius: var(--curvature);\n border-bottom-right-radius: var(--curvature);\n }\n\n .chatbox.full {\n border-bottom-right-radius: 0 !important;\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 temba-completion {\n --textarea-height: 2.5em;\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#send-button {\n --button-y: 1px;\n --button-x: 12px;\n margin-top: 0.8em;\n align-self: flex-end;\n }\n\n temba-button#reopen-button {\n --button-y: 1px;\n --button-x: 12px;\n }\n\n .toolbar {\n position: relative;\n width: 2.5em;\n background: #e6e6e6;\n transition: all 600ms ease-in;\n z-index: 10;\n flex-shrink: 0;\n border-top-right-radius: var(--curvature);\n border-bottom-right-radius: var(--curvature);\n padding: 0.5em 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n overflow: hidden;\n }\n\n .toolbar temba-icon {\n fill: rgb(60, 60, 60);\n margin-bottom: 0.5em;\n }\n\n .toolbar.closed {\n box-shadow: inset 10px 0px 10px -11px rgb(0 0 0 / 15%);\n }\n\n temba-contact-details {\n flex-basis: 16em;\n flex-grow: 0;\n flex-shrink: 0;\n transition: margin 600ms cubic-bezier(0.68, -0.55, 0.265, 1.05),\n opacity 600ms ease-in-out 200ms;\n z-index: 5;\n }\n\n temba-contact-details.hidden {\n margin-right: -16em;\n opacity: 0;\n }\n\n @media only screen and (max-width: 768px) {\n temba-contact-details {\n flex-basis: 12em;\n flex-shrink: 0;\n }\n\n temba-contact-details.hidden {\n margin-right: -12em;\n }\n }\n\n #close-button,\n #open-button {\n margin-top: 1em;\n }\n\n #details-button {\n margin-top: 0.25em;\n transform: rotate(180deg);\n }\n\n #note-dialog,\n #assign-dialog {\n --header-bg: rgb(255, 249, 194);\n --header-text: #555;\n --textarea-height: 5em;\n }\n `;\n }\n\n @property({ type: String, attribute: 'contact' })\n contactUUID: string;\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 currentChat = '';\n\n @property({ type: String })\n currentNote = '';\n\n @property({ type: Boolean })\n showDetails = true;\n\n @property({ type: Boolean })\n toolbar = false;\n\n @property({ type: Boolean })\n monitor = false;\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 constructor() {\n super();\n this.showDetails = getCookieBoolean(COOKIE_KEYS.TICKET_SHOW_DETAILS);\n }\n\n refreshInterval = null;\n\n public connectedCallback() {\n super.connectedCallback();\n if (this.monitor) {\n this.refreshInterval = setInterval(() => {\n if (this.currentTicket && this.currentTicket.closed_on) {\n return;\n }\n this.refresh();\n }, DEFAULT_REFRESH);\n }\n }\n\n public disconnectedCallback() {\n if (this.refreshInterval) {\n clearInterval(this.refreshInterval);\n }\n }\n\n public getContactHistory(): ContactHistory {\n return this.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as ContactHistory;\n }\n\n public refresh(scrollToBottom = false): void {\n const contactHistory = this.getContactHistory();\n if (contactHistory) {\n if (scrollToBottom) {\n contactHistory.scrollToBottom();\n }\n contactHistory.refresh();\n }\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // we were provided a uuid, fetch our contact details\n if (changedProperties.has('contactUUID') && this.contactUUID) {\n fetchContact(this.contactsEndpoint + '?uuid=' + this.contactUUID).then(\n contact => {\n this.currentContact = contact;\n }\n );\n }\n\n // if we don't have an endpoint infer one\n if (changedProperties.has('currentContact')) {\n // focus our completion on load\n const prevContact = changedProperties.get('contact');\n if (\n !prevContact ||\n (this.currentContact &&\n this.currentContact.ticket &&\n this.currentContact.ticket.uuid !== prevContact.ticket.uuid)\n ) {\n const completion = this.shadowRoot.querySelector(\n 'temba-completion'\n ) as Completion;\n if (completion) {\n window.setTimeout(() => {\n completion.click();\n }, 0);\n }\n }\n }\n }\n\n private handleChatChange(event: Event) {\n event.stopPropagation();\n event.preventDefault();\n\n const chat = event.currentTarget as TextInput;\n this.currentChat = chat.value;\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.refresh();\n this.fireCustomEvent(CustomEventType.ContentChanged, {\n ticket: { uuid, status: 'open' },\n });\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n private handleSend() {\n const payload = {\n contacts: [this.currentContact.uuid],\n text: this.currentChat,\n };\n\n if (this.currentTicket) {\n payload['ticket'] = this.currentTicket.uuid;\n }\n\n postJSON(`/api/v2/broadcasts.json`, payload)\n .then(() => {\n this.currentChat = '';\n this.refresh(true);\n })\n .catch(err => {\n // error message dialog?\n console.error(err);\n });\n }\n\n private handleTicketAssigned() {\n this.refresh();\n this.getContactHistory().checkForAgentAssignmentEvent(this.agent);\n }\n\n private handleDetailSlider(): void {\n this.showDetails = !this.showDetails;\n setCookie(COOKIE_KEYS.TICKET_SHOW_DETAILS, this.showDetails);\n }\n\n public render(): TemplateResult {\n return html`\n <div\n style=\"flex-grow: 1; margin-right: 0em; display:flex; flex-direction:row; min-height: 0;\"\n class=\"left-pane ${this.showDetails ? 'open' : ''}\"\n >\n <div class=\"chat-wrapper\">\n ${this.currentContact\n ? html`<temba-contact-history\n .uuid=${this.currentContact.uuid}\n .contact=${this.currentContact}\n .ticket=${\n this.currentTicket ? this.currentTicket.uuid : null\n }\n .endDate=${\n this.currentTicket ? this.currentTicket.closed_on : null\n }\n .agent=${this.agent}\n ></temba-contact-history>\n\n ${\n this.currentTicket && this.currentTicket.closed_on\n ? html`<div class=\"closed-footer\">\n <temba-button\n id=\"reopen-button\"\n name=\"Reopen\"\n @click=${this.handleReopen}\n ></temba-button>\n </div>`\n : html` <div\n class=\"chatbox ${this.toolbar ? 'full' : ''}\"\n >\n <temba-completion\n @change=${this.handleChatChange}\n .value=${this.currentChat}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n const chat = e.target as Completion;\n if (!chat.hasVisibleOptions()) {\n this.handleSend();\n e.preventDefault();\n e.stopPropagation();\n }\n }\n }}\n textarea\n >\n </temba-completion>\n <temba-button\n id=\"send-button\"\n name=\"Send\"\n @click=${this.handleSend}\n ?disabled=${this.currentChat.trim().length === 0}\n ></temba-button>\n </div>`\n }\n </div>`\n : null}\n </div>\n </div>\n\n ${this.toolbar\n ? html`${\n this.currentContact\n ? html`<temba-contact-details\n style=\"z-index: 10\"\n class=\"${this.showDetails ? '' : 'hidden'}\"\n showGroups=\"true\"\n .visible=${this.showDetails}\n .ticket=${this.currentTicket}\n .contact=${this.currentContact}\n ></temba-contact-details>`\n : null\n }\n\n <div class=\"toolbar ${this.showDetails ? '' : 'closed'}\">\n ${\n this.currentContact\n ? html`\n <temba-tip\n style=\"margin-top:5px\"\n text=\"${this.showDetails ? 'Hide Details' : 'Show Details'}\"\n position=\"left\"\n hideOnChange\n >\n <temba-icon\n id=\"details-button\"\n name=\"${this.showDetails ? 'chevrons-left' : 'sidebar'}\"\n @click=\"${this.handleDetailSlider}\"\n clickable\n animatechange=\"spin\"\n ></temba-icon>\n </temba-tip>\n\n ${this.currentTicket\n ? html`<temba-tip\n style=\"margin-top:5px\"\n text=\"Assign\"\n position=\"left\"\n >\n <temba-icon\n id=\"assign-button\"\n name=\"user\"\n @click=\"${() => {\n const modax = this.shadowRoot.getElementById(\n 'assign-dialog'\n ) as Modax;\n modax.open = true;\n }}\"\n clickable\n ></temba-icon>\n </temba-tip>\n <temba-tip\n style=\"margin-top:5px\"\n text=\"Add Note\"\n position=\"left\"\n >\n <temba-icon\n id=\"add-note-button\"\n name=\"edit\"\n @click=\"${() => {\n const note = this.shadowRoot.getElementById(\n 'note-dialog'\n ) as Modax;\n note.open = true;\n }}\"\n clickable\n ></temba-icon>\n </temba-tip>`\n : null}\n `\n : null\n }\n </div>\n </div>\n\n ${\n this.currentTicket\n ? html`<temba-modax\n header=\"Add Note\"\n id=\"note-dialog\"\n @temba-submitted=${this.refresh}\n endpoint=\"/ticket/note/${this.currentTicket.uuid}/\"\n ></temba-modax>\n <temba-modax\n header=\"Assign Ticket\"\n id=\"assign-dialog\"\n @temba-submitted=${this.handleTicketAssigned}\n endpoint=\"/ticket/assign/${this.currentTicket.uuid}/\"\n /></temba-modax>`\n : null\n }`\n : null}\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"ContactChat.js","sourceRoot":"","sources":["../../../src/contacts/ContactChat.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAW,eAAe,EAAU,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAK9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,MAAM,OAAO,WAAY,SAAQ,mBAAmB;IAuLlD;QACE,KAAK,EAAE,CAAC;QA3BV,qBAAgB,GAAG,uBAAuB,CAAC;QAG3C,gBAAW,GAAG,EAAE,CAAC;QAGjB,gBAAW,GAAG,EAAE,CAAC;QAGjB,gBAAW,GAAG,IAAI,CAAC;QAGnB,YAAO,GAAG,KAAK,CAAC;QAGhB,YAAO,GAAG,KAAK,CAAC;QAGhB,kBAAa,GAAW,IAAI,CAAC;QAG7B,mBAAc,GAAY,IAAI,CAAC;QAG/B,UAAK,GAAG,EAAE,CAAC;QAOX,oBAAe,GAAG,IAAI,CAAC;QAHrB,IAAI,CAAC,WAAW,GAAG,gBAAgB,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;IACvE,CAAC;IAzLM,MAAM,KAAK,MAAM;QACtB,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoJT,CAAC;IACJ,CAAC;IAuCM,iBAAiB;QACtB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;gBACtC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;oBACtD,OAAO;iBACR;gBACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC,EAAE,eAAe,CAAC,CAAC;SACrB;IACH,CAAC;IAEM,oBAAoB;QACzB,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;SACrC;IACH,CAAC;IAEM,iBAAiB;QACtB,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAClC,uBAAuB,CACN,CAAC;IACtB,CAAC;IAEM,OAAO,CAAC,cAAc,GAAG,KAAK;QACnC,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAChD,IAAI,cAAc,EAAE;YAClB,IAAI,cAAc,EAAE;gBAClB,cAAc,CAAC,cAAc,EAAE,CAAC;aACjC;YACD,cAAc,CAAC,OAAO,EAAE,CAAC;SAC1B;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;YACA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC;YAChC,+BAA+B;YAC/B,MAAM,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACrD,IACE,CAAC,WAAW;gBACZ,CAAC,IAAI,CAAC,cAAc;oBAClB,IAAI,CAAC,cAAc,CAAC,MAAM;oBAC1B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAC9D;gBACA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAC9C,kBAAkB,CACL,CAAC;gBAChB,IAAI,UAAU,EAAE;oBACd,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;wBACrB,UAAU,CAAC,KAAK,EAAE,CAAC;oBACrB,CAAC,EAAE,CAAC,CAAC,CAAC;iBACP;aACF;SACF;IACH,CAAC;IAEO,gBAAgB,CAAC,KAAY;QACnC,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,KAAK,CAAC,cAAc,EAAE,CAAC;QAEvB,MAAM,IAAI,GAAG,KAAK,CAAC,aAA0B,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;IAChC,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,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,EAAE;gBACnD,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;aACjC,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,QAAa,EAAE,EAAE;YACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,UAAU;QAChB,MAAM,OAAO,GAAG;YACd,QAAQ,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YACpC,IAAI,EAAE,IAAI,CAAC,WAAW;SACvB,CAAC;QAEF,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;SAC7C;QAED,QAAQ,CAAC,yBAAyB,EAAE,OAAO,CAAC;aACzC,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,wBAAwB;YACxB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,iBAAiB,EAAE,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;QACrC,SAAS,CAAC,WAAW,CAAC,mBAAmB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/D,CAAC;IAEM,MAAM;QACX,OAAO,IAAI,CAAA;;;4BAGa,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;;;YAG9C,IAAI,CAAC,cAAc;YACnB,CAAC,CAAC,IAAI,CAAA;4BACU,IAAI,CAAC,cAAc,CAAC,IAAI;+BACrB,IAAI,CAAC,cAAc;8BAE5B,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IACjD;+BAEE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IACtD;6BACS,IAAI,CAAC,KAAK;;;oBAInB,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS;gBAChD,CAAC,CAAC,IAAI,CAAA;;;;qCAIS,IAAI,CAAC,YAAY;;+BAEvB;gBACT,CAAC,CAAC,IAAI,CAAA;2CACe,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;;;sCAG/B,IAAI,CAAC,gBAAgB;qCACtB,IAAI,CAAC,WAAW;uCACd,CAAC,CAAgB,EAAE,EAAE;oBAC9B,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;wBACpC,MAAM,IAAI,GAAG,CAAC,CAAC,MAAoB,CAAC;wBACpC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;4BAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;4BAClB,CAAC,CAAC,cAAc,EAAE,CAAC;4BACnB,CAAC,CAAC,eAAe,EAAE,CAAC;yBACrB;qBACF;gBACH,CAAC;;;;;;;qCAOQ,IAAI,CAAC,UAAU;wCACZ,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;;+BAG1D;yBACO;YACb,CAAC,CAAC,IAAI;;;;QAIV,IAAI,CAAC,OAAO;YACZ,CAAC,CAAC,IAAI,CAAA,GACF,IAAI,CAAC,cAAc;gBACjB,CAAC,CAAC,IAAI,CAAA;;2BAEO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;;6BAE9B,IAAI,CAAC,WAAW;4BACjB,IAAI,CAAC,aAAa;6BACjB,IAAI,CAAC,cAAc;0CACN;gBAC5B,CAAC,CAAC,IACN;;8BAEoB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;YAElD,IAAI,CAAC,cAAc;gBACjB,CAAC,CAAC,IAAI,CAAA;;;4BAGQ,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc;;;;;;8BAMhD,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;gCAC5C,IAAI,CAAC,kBAAkB;;;;;;oBAMnC,IAAI,CAAC,aAAa;oBAClB,CAAC,CAAC,IAAI,CAAA;;;;;;;;sCAQY,GAAG,EAAE;wBACb,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAC1C,eAAe,CACP,CAAC;wBACX,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;oBACpB,CAAC;;;;;;;;;;;;sCAYS,GAAG,EAAE;wBACb,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CACzC,aAAa,CACL,CAAC;wBACX,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;oBACnB,CAAC;;;qCAGQ;oBACjB,CAAC,CAAC,IAAI;iBACT;gBACH,CAAC,CAAC,IACN;;;;QAKF,IAAI,CAAC,aAAa;gBAChB,CAAC,CAAC,IAAI,CAAA;;;iCAGiB,IAAI,CAAC,OAAO;uCACN,IAAI,CAAC,aAAa,CAAC,IAAI;;;;;iCAK7B,IAAI,CAAC,oBAAoB;yCACjB,IAAI,CAAC,aAAa,CAAC,IAAI;6BACnC;gBACnB,CAAC,CAAC,IACN,EAAE;YACA,CAAC,CAAC,IAAI;KACT,CAAC;IACJ,CAAC;CACF;AAtTC;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,MAAM,EAAE,CAAC;gDACV;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gDACT;AAGnB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;4CACZ;AAGhB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;4CACZ;AAGhB;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","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators';\nimport { Contact, CustomEventType, Ticket } from '../interfaces';\nimport { COOKIE_KEYS, getCookieBoolean, postJSON, setCookie } from '../utils';\nimport { TextInput } from '../textinput/TextInput';\nimport { Completion } from '../completion/Completion';\nimport { ContactHistory } from './ContactHistory';\nimport { Modax } from '../dialog/Modax';\nimport { ContactStoreElement } from './ContactStoreElement';\n\nconst DEFAULT_REFRESH = 10000;\n\nexport class ContactChat extends ContactStoreElement {\n public static get styles() {\n return css`\n .left-pane {\n box-shadow: -13px 10px 7px 14px rgba(0, 0, 0, 0);\n transition: box-shadow 600ms linear;\n }\n\n .left-pane.open {\n z-index: 1000;\n }\n\n :host {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n min-height: 0;\n border-radius: var(--curvature);\n }\n\n .chat-wrapper {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n }\n\n temba-contact-history {\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .chatbox {\n padding: 1em;\n background: #f2f2f2;\n border-top: 3px solid #e1e1e1;\n display: flex;\n flex-direction: column;\n z-index: 3;\n border-bottom-left-radius: var(--curvature);\n border-bottom-right-radius: var(--curvature);\n }\n\n .chatbox.full {\n border-bottom-right-radius: 0 !important;\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 temba-completion {\n --textarea-height: 2.5em;\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#send-button {\n --button-y: 1px;\n --button-x: 12px;\n margin-top: 0.8em;\n align-self: flex-end;\n }\n\n temba-button#reopen-button {\n --button-y: 1px;\n --button-x: 12px;\n }\n\n .toolbar {\n position: relative;\n width: 2.5em;\n background: #e6e6e6;\n transition: all 600ms ease-in;\n z-index: 10;\n flex-shrink: 0;\n border-top-right-radius: var(--curvature);\n border-bottom-right-radius: var(--curvature);\n padding: 0.5em 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n overflow: hidden;\n }\n\n .toolbar temba-icon {\n fill: rgb(60, 60, 60);\n margin-bottom: 0.5em;\n }\n\n .toolbar.closed {\n box-shadow: inset 10px 0px 10px -11px rgb(0 0 0 / 15%);\n }\n\n temba-contact-details {\n flex-basis: 16em;\n flex-grow: 0;\n flex-shrink: 0;\n transition: margin 600ms cubic-bezier(0.68, -0.55, 0.265, 1.05),\n opacity 600ms ease-in-out 200ms;\n z-index: 5;\n }\n\n temba-contact-details.hidden {\n margin-right: -16em;\n opacity: 0;\n }\n\n @media only screen and (max-width: 768px) {\n temba-contact-details {\n flex-basis: 12em;\n flex-shrink: 0;\n }\n\n temba-contact-details.hidden {\n margin-right: -12em;\n }\n }\n\n #close-button,\n #open-button {\n margin-top: 1em;\n }\n\n #details-button {\n margin-top: 0.25em;\n transform: rotate(180deg);\n }\n\n #note-dialog,\n #assign-dialog {\n --header-bg: rgb(255, 249, 194);\n --header-text: #555;\n --textarea-height: 5em;\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 currentChat = '';\n\n @property({ type: String })\n currentNote = '';\n\n @property({ type: Boolean })\n showDetails = true;\n\n @property({ type: Boolean })\n toolbar = false;\n\n @property({ type: Boolean })\n monitor = false;\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 constructor() {\n super();\n this.showDetails = getCookieBoolean(COOKIE_KEYS.TICKET_SHOW_DETAILS);\n }\n\n refreshInterval = null;\n\n public connectedCallback() {\n super.connectedCallback();\n if (this.monitor) {\n this.refreshInterval = setInterval(() => {\n if (this.currentTicket && this.currentTicket.closed_on) {\n return;\n }\n this.refresh();\n }, DEFAULT_REFRESH);\n }\n }\n\n public disconnectedCallback() {\n if (this.refreshInterval) {\n clearInterval(this.refreshInterval);\n }\n }\n\n public getContactHistory(): ContactHistory {\n return this.shadowRoot.querySelector(\n 'temba-contact-history'\n ) as ContactHistory;\n }\n\n public refresh(scrollToBottom = false): void {\n const contactHistory = this.getContactHistory();\n if (contactHistory) {\n if (scrollToBottom) {\n contactHistory.scrollToBottom();\n }\n contactHistory.refresh();\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 this.currentContact = this.data;\n // focus our completion on load\n const prevContact = changedProperties.get('contact');\n if (\n !prevContact ||\n (this.currentContact &&\n this.currentContact.ticket &&\n this.currentContact.ticket.uuid !== prevContact.ticket.uuid)\n ) {\n const completion = this.shadowRoot.querySelector(\n 'temba-completion'\n ) as Completion;\n if (completion) {\n window.setTimeout(() => {\n completion.click();\n }, 0);\n }\n }\n }\n }\n\n private handleChatChange(event: Event) {\n event.stopPropagation();\n event.preventDefault();\n\n const chat = event.currentTarget as TextInput;\n this.currentChat = chat.value;\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.refresh();\n this.fireCustomEvent(CustomEventType.ContentChanged, {\n ticket: { uuid, status: 'open' },\n });\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n private handleSend() {\n const payload = {\n contacts: [this.currentContact.uuid],\n text: this.currentChat,\n };\n\n if (this.currentTicket) {\n payload['ticket'] = this.currentTicket.uuid;\n }\n\n postJSON(`/api/v2/broadcasts.json`, payload)\n .then(() => {\n this.currentChat = '';\n this.refresh(true);\n })\n .catch(err => {\n // error message dialog?\n console.error(err);\n });\n }\n\n private handleTicketAssigned() {\n this.refresh();\n this.getContactHistory().checkForAgentAssignmentEvent(this.agent);\n }\n\n private handleDetailSlider(): void {\n this.showDetails = !this.showDetails;\n setCookie(COOKIE_KEYS.TICKET_SHOW_DETAILS, this.showDetails);\n }\n\n public render(): TemplateResult {\n return html`\n <div\n style=\"flex-grow: 1; margin-right: 0em; display:flex; flex-direction:row; min-height: 0;\"\n class=\"left-pane ${this.showDetails ? 'open' : ''}\"\n >\n <div class=\"chat-wrapper\">\n ${this.currentContact\n ? html`<temba-contact-history\n .uuid=${this.currentContact.uuid}\n .contact=${this.currentContact}\n .ticket=${\n this.currentTicket ? this.currentTicket.uuid : null\n }\n .endDate=${\n this.currentTicket ? this.currentTicket.closed_on : null\n }\n .agent=${this.agent}\n ></temba-contact-history>\n\n ${\n this.currentTicket && this.currentTicket.closed_on\n ? html`<div class=\"closed-footer\">\n <temba-button\n id=\"reopen-button\"\n name=\"Reopen\"\n @click=${this.handleReopen}\n ></temba-button>\n </div>`\n : html` <div\n class=\"chatbox ${this.toolbar ? 'full' : ''}\"\n >\n <temba-completion\n @change=${this.handleChatChange}\n .value=${this.currentChat}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n const chat = e.target as Completion;\n if (!chat.hasVisibleOptions()) {\n this.handleSend();\n e.preventDefault();\n e.stopPropagation();\n }\n }\n }}\n textarea\n >\n </temba-completion>\n <temba-button\n id=\"send-button\"\n name=\"Send\"\n @click=${this.handleSend}\n ?disabled=${this.currentChat.trim().length === 0}\n ></temba-button>\n </div>`\n }\n </div>`\n : null}\n </div>\n </div>\n\n ${this.toolbar\n ? html`${\n this.currentContact\n ? html`<temba-contact-details\n style=\"z-index: 10\"\n class=\"${this.showDetails ? '' : 'hidden'}\"\n showGroups=\"true\"\n .visible=${this.showDetails}\n .ticket=${this.currentTicket}\n .contact=${this.currentContact}\n ></temba-contact-details>`\n : null\n }\n\n <div class=\"toolbar ${this.showDetails ? '' : 'closed'}\">\n ${\n this.currentContact\n ? html`\n <temba-tip\n style=\"margin-top:5px\"\n text=\"${this.showDetails ? 'Hide Details' : 'Show Details'}\"\n position=\"left\"\n hideOnChange\n >\n <temba-icon\n id=\"details-button\"\n name=\"${this.showDetails ? 'chevrons-left' : 'sidebar'}\"\n @click=\"${this.handleDetailSlider}\"\n clickable\n animatechange=\"spin\"\n ></temba-icon>\n </temba-tip>\n\n ${this.currentTicket\n ? html`<temba-tip\n style=\"margin-top:5px\"\n text=\"Assign\"\n position=\"left\"\n >\n <temba-icon\n id=\"assign-button\"\n name=\"user\"\n @click=\"${() => {\n const modax = this.shadowRoot.getElementById(\n 'assign-dialog'\n ) as Modax;\n modax.open = true;\n }}\"\n clickable\n ></temba-icon>\n </temba-tip>\n <temba-tip\n style=\"margin-top:5px\"\n text=\"Add Note\"\n position=\"left\"\n >\n <temba-icon\n id=\"add-note-button\"\n name=\"edit\"\n @click=\"${() => {\n const note = this.shadowRoot.getElementById(\n 'note-dialog'\n ) as Modax;\n note.open = true;\n }}\"\n clickable\n ></temba-icon>\n </temba-tip>`\n : null}\n `\n : null\n }\n </div>\n </div>\n\n ${\n this.currentTicket\n ? html`<temba-modax\n header=\"Add Note\"\n id=\"note-dialog\"\n @temba-submitted=${this.refresh}\n endpoint=\"/ticket/note/${this.currentTicket.uuid}/\"\n ></temba-modax>\n <temba-modax\n header=\"Assign Ticket\"\n id=\"assign-dialog\"\n @temba-submitted=${this.handleTicketAssigned}\n endpoint=\"/ticket/assign/${this.currentTicket.uuid}/\"\n /></temba-modax>`\n : null\n }`\n : null}\n `;\n }\n}\n"]}
@@ -0,0 +1,199 @@
1
+ import { __decorate } from "tslib";
2
+ import { css, html } from 'lit';
3
+ import { property } from 'lit/decorators';
4
+ import { RapidElement } from '../RapidElement';
5
+ export class ContactFieldEditor extends RapidElement {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.icon = navigator.clipboard ? 'copy' : '';
9
+ this.iconClass = '';
10
+ }
11
+ static get styles() {
12
+ return css `
13
+ .prefix {
14
+ background: rgba(0, 0, 0, 0.05);
15
+ border-top-left-radius: 4px;
16
+ border-bottom-left-radius: 4px;
17
+ color: #888;
18
+ cursor: pointer;
19
+ width: 100px;
20
+ white-space: nowrap;
21
+ overflow: hidden;
22
+ text-overflow: ellipsis;
23
+ display: flex;
24
+ padding: 0em 0.5em;
25
+ }
26
+
27
+ .prefix .name {
28
+ padding: 0.5em 0em;
29
+ color: #888;
30
+ width: 80px;
31
+ white-space: nowrap;
32
+ overflow: hidden;
33
+ text-overflow: ellipsis;
34
+ }
35
+
36
+ .postfix {
37
+ display: flex;
38
+ align-items: stretch;
39
+ }
40
+
41
+ .popper {
42
+ padding: 0.5em 0.75em;
43
+ background: rgba(240, 240, 240, 1);
44
+ border-top-right-radius: 4px;
45
+ border-bottom-right-radius: 4px;
46
+ --icon-color: #888;
47
+ opacity: 0;
48
+ cursor: default;
49
+ transform: scale(0.5);
50
+ transition: all 300ms ease-in-out;
51
+ display: flex;
52
+ align-items: stretch;
53
+ z-index: 1000;
54
+ }
55
+
56
+ .postfix temba-icon[name='calendar'] {
57
+ --icon-color: #e3e3e3;
58
+ }
59
+
60
+ .popper.check {
61
+ background: rgba(90, 145, 86, 0.15);
62
+ }
63
+
64
+ .popper.none {
65
+ opacity: 0;
66
+ }
67
+
68
+ .popper.copy temba-icon:hover {
69
+ --icon-color: #555;
70
+ }
71
+
72
+ .popper.corner-down-left {
73
+ // background: var(--color-primary-dark);
74
+ // --icon-color: var(--color-text-light);
75
+ opacity: 1;
76
+ transform: scale(1);
77
+ }
78
+
79
+ temba-icon {
80
+ cursor: pointer;
81
+ }
82
+
83
+ temba-icon[name='check'] {
84
+ --icon-color: rgb(90, 145, 86);
85
+ }
86
+
87
+ temba-textinput:hover .popper.copy {
88
+ opacity: 1;
89
+ transform: scale(1);
90
+ }
91
+
92
+ temba-textinput:focus .popper.copy {
93
+ opacity: 1;
94
+ transform: scale(1);
95
+ }
96
+
97
+ .copy.clicked temba-icon {
98
+ transform: scale(1.2);
99
+ }
100
+
101
+ temba-icon {
102
+ transition: all 200ms ease-in-out;
103
+ }
104
+ `;
105
+ }
106
+ connectedCallback() {
107
+ super.connectedCallback();
108
+ this.handleInput = this.handleInput.bind(this);
109
+ this.handleSubmit = this.handleSubmit.bind(this);
110
+ }
111
+ handleIconClick(evt) {
112
+ const ele = evt.target;
113
+ const icon = ele.getAttribute('name');
114
+ const input = this.shadowRoot.querySelector('temba-textinput');
115
+ if (icon === 'copy') {
116
+ if (navigator.clipboard) {
117
+ this.iconClass = 'clicked';
118
+ navigator.clipboard.writeText(input.getDisplayValue()).then(() => {
119
+ window.setTimeout(() => {
120
+ this.iconClass = '';
121
+ }, 300);
122
+ });
123
+ }
124
+ }
125
+ evt.preventDefault();
126
+ evt.stopPropagation();
127
+ }
128
+ handleSubmit() {
129
+ const input = this.shadowRoot.querySelector('temba-textinput');
130
+ if (input.value !== this.value) {
131
+ this.value = input.value;
132
+ this.fireEvent('change');
133
+ }
134
+ this.icon = navigator.clipboard ? 'copy' : '';
135
+ }
136
+ handleChange(evt) {
137
+ evt.preventDefault();
138
+ evt.stopPropagation();
139
+ }
140
+ handleInput(evt) {
141
+ if (evt.key === 'Enter') {
142
+ const input = evt.currentTarget;
143
+ input.blur();
144
+ }
145
+ }
146
+ render() {
147
+ return html `
148
+ <div>
149
+ <temba-textinput
150
+ value="${this.value ? this.value : ''}"
151
+ ?datetimepicker=${this.type === 'datetime'}
152
+ @blur=${this.handleSubmit}
153
+ @keydown=${this.handleInput}
154
+ @change=${this.handleChange}
155
+ >
156
+ <div class="prefix" slot="prefix">
157
+ <div class="name">${this.name}</div>
158
+ </div>
159
+
160
+ <div class="postfix">
161
+ ${this.type === 'datetime'
162
+ ? html `<div
163
+ style="position: absolute; padding-top: .75em; padding-left: .75em;"
164
+ >
165
+ <temba-icon name="calendar" />
166
+ </div>`
167
+ : null}
168
+
169
+ <div
170
+ class="popper ${this.iconClass} ${this.icon ? this.icon : 'none'}"
171
+ @click=${this.handleIconClick}
172
+ >
173
+ <temba-icon name="${this.icon}" animatechange="spin"></temba-icon>
174
+ </div>
175
+ </div>
176
+ </temba-textinput>
177
+ </div>
178
+ `;
179
+ }
180
+ }
181
+ __decorate([
182
+ property({ type: String })
183
+ ], ContactFieldEditor.prototype, "key", void 0);
184
+ __decorate([
185
+ property({ type: String })
186
+ ], ContactFieldEditor.prototype, "value", void 0);
187
+ __decorate([
188
+ property({ type: String })
189
+ ], ContactFieldEditor.prototype, "name", void 0);
190
+ __decorate([
191
+ property({ type: String })
192
+ ], ContactFieldEditor.prototype, "type", void 0);
193
+ __decorate([
194
+ property({ type: String })
195
+ ], ContactFieldEditor.prototype, "icon", void 0);
196
+ __decorate([
197
+ property({ type: String })
198
+ ], ContactFieldEditor.prototype, "iconClass", void 0);
199
+ //# sourceMappingURL=ContactFieldEditor.js.map