@nyaruka/temba-components 0.86.1 → 0.88.0

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 (288) hide show
  1. package/.eslintrc.js +3 -3
  2. package/.prettierrc +6 -0
  3. package/.storybook/main.js +3 -3
  4. package/.storybook/preview.js +2 -2
  5. package/CHANGELOG.md +24 -24
  6. package/CreateIncludesPlugin.js +2 -2
  7. package/demo/index.html +1 -0
  8. package/dist/locales/es.js +1 -1
  9. package/dist/locales/es.js.map +1 -1
  10. package/dist/locales/fr.js +1 -1
  11. package/dist/locales/fr.js.map +1 -1
  12. package/dist/locales/pt.js +1 -1
  13. package/dist/locales/pt.js.map +1 -1
  14. package/dist/temba-components.js +647 -535
  15. package/dist/temba-components.js.map +1 -1
  16. package/out-tsc/src/RapidElement.js +3 -3
  17. package/out-tsc/src/RapidElement.js.map +1 -1
  18. package/out-tsc/src/ResizeElement.js +2 -2
  19. package/out-tsc/src/ResizeElement.js.map +1 -1
  20. package/out-tsc/src/aliaseditor/AliasEditor.js +1 -1
  21. package/out-tsc/src/aliaseditor/AliasEditor.js.map +1 -1
  22. package/out-tsc/src/button/Button.js +1 -1
  23. package/out-tsc/src/button/Button.js.map +1 -1
  24. package/out-tsc/src/charcount/helpers.js +1 -1
  25. package/out-tsc/src/charcount/helpers.js.map +1 -1
  26. package/out-tsc/src/colorpicker/ColorPicker.js +4 -4
  27. package/out-tsc/src/colorpicker/ColorPicker.js.map +1 -1
  28. package/out-tsc/src/completion/Completion.js +2 -2
  29. package/out-tsc/src/completion/Completion.js.map +1 -1
  30. package/out-tsc/src/completion/ExcellentParser.js +1 -1
  31. package/out-tsc/src/completion/ExcellentParser.js.map +1 -1
  32. package/out-tsc/src/completion/helpers.js +8 -8
  33. package/out-tsc/src/completion/helpers.js.map +1 -1
  34. package/out-tsc/src/compose/Compose.js +14 -14
  35. package/out-tsc/src/compose/Compose.js.map +1 -1
  36. package/out-tsc/src/contacts/ContactBadges.js +2 -2
  37. package/out-tsc/src/contacts/ContactBadges.js.map +1 -1
  38. package/out-tsc/src/contacts/ContactChat.js +4 -4
  39. package/out-tsc/src/contacts/ContactChat.js.map +1 -1
  40. package/out-tsc/src/contacts/ContactDetails.js +4 -4
  41. package/out-tsc/src/contacts/ContactDetails.js.map +1 -1
  42. package/out-tsc/src/contacts/ContactFieldEditor.js +3 -3
  43. package/out-tsc/src/contacts/ContactFieldEditor.js.map +1 -1
  44. package/out-tsc/src/contacts/ContactFields.js +2 -2
  45. package/out-tsc/src/contacts/ContactFields.js.map +1 -1
  46. package/out-tsc/src/contacts/ContactHistory.js +21 -19
  47. package/out-tsc/src/contacts/ContactHistory.js.map +1 -1
  48. package/out-tsc/src/contacts/ContactPending.js +4 -4
  49. package/out-tsc/src/contacts/ContactPending.js.map +1 -1
  50. package/out-tsc/src/contacts/ContactTickets.js +8 -8
  51. package/out-tsc/src/contacts/ContactTickets.js.map +1 -1
  52. package/out-tsc/src/contacts/events.js +2 -2
  53. package/out-tsc/src/contacts/events.js.map +1 -1
  54. package/out-tsc/src/contacts/helpers.js +2 -2
  55. package/out-tsc/src/contacts/helpers.js.map +1 -1
  56. package/out-tsc/src/contactsearch/ContactSearch.js +7 -7
  57. package/out-tsc/src/contactsearch/ContactSearch.js.map +1 -1
  58. package/out-tsc/src/date/TembaDate.js +1 -1
  59. package/out-tsc/src/date/TembaDate.js.map +1 -1
  60. package/out-tsc/src/datepicker/DatePicker.js +1 -1
  61. package/out-tsc/src/datepicker/DatePicker.js.map +1 -1
  62. package/out-tsc/src/dialog/Dialog.js +5 -5
  63. package/out-tsc/src/dialog/Dialog.js.map +1 -1
  64. package/out-tsc/src/dialog/Modax.js +8 -8
  65. package/out-tsc/src/dialog/Modax.js.map +1 -1
  66. package/out-tsc/src/dropdown/Dropdown.js +1 -1
  67. package/out-tsc/src/dropdown/Dropdown.js.map +1 -1
  68. package/out-tsc/src/fields/FieldManager.js +6 -6
  69. package/out-tsc/src/fields/FieldManager.js.map +1 -1
  70. package/out-tsc/src/imagepicker/ImagePicker.js +4 -4
  71. package/out-tsc/src/imagepicker/ImagePicker.js.map +1 -1
  72. package/out-tsc/src/interfaces.js.map +1 -1
  73. package/out-tsc/src/label/Label.js +1 -1
  74. package/out-tsc/src/label/Label.js.map +1 -1
  75. package/out-tsc/src/leafletmap/LeafletMap.js +6 -6
  76. package/out-tsc/src/leafletmap/LeafletMap.js.map +1 -1
  77. package/out-tsc/src/leafletmap/helpers.js +2 -2
  78. package/out-tsc/src/leafletmap/helpers.js.map +1 -1
  79. package/out-tsc/src/lightbox/Lightbox.js +2 -2
  80. package/out-tsc/src/lightbox/Lightbox.js.map +1 -1
  81. package/out-tsc/src/list/ContentMenu.js +8 -8
  82. package/out-tsc/src/list/ContentMenu.js.map +1 -1
  83. package/out-tsc/src/list/RunList.js +1 -1
  84. package/out-tsc/src/list/RunList.js.map +1 -1
  85. package/out-tsc/src/list/SortableList.js +6 -6
  86. package/out-tsc/src/list/SortableList.js.map +1 -1
  87. package/out-tsc/src/list/TembaList.js +9 -7
  88. package/out-tsc/src/list/TembaList.js.map +1 -1
  89. package/out-tsc/src/list/TembaMenu.js +22 -22
  90. package/out-tsc/src/list/TembaMenu.js.map +1 -1
  91. package/out-tsc/src/loading/Loading.js +1 -1
  92. package/out-tsc/src/loading/Loading.js.map +1 -1
  93. package/out-tsc/src/locales/es.js +1 -1
  94. package/out-tsc/src/locales/es.js.map +1 -1
  95. package/out-tsc/src/locales/fr.js +1 -1
  96. package/out-tsc/src/locales/fr.js.map +1 -1
  97. package/out-tsc/src/locales/pt.js +1 -1
  98. package/out-tsc/src/locales/pt.js.map +1 -1
  99. package/out-tsc/src/omnibox/Omnibox.js +1 -1
  100. package/out-tsc/src/omnibox/Omnibox.js.map +1 -1
  101. package/out-tsc/src/options/Options.js +9 -9
  102. package/out-tsc/src/options/Options.js.map +1 -1
  103. package/out-tsc/src/remote/Remote.js +1 -1
  104. package/out-tsc/src/remote/Remote.js.map +1 -1
  105. package/out-tsc/src/select/Select.js +18 -18
  106. package/out-tsc/src/select/Select.js.map +1 -1
  107. package/out-tsc/src/sms/gsmsplitter.js +8 -8
  108. package/out-tsc/src/sms/gsmsplitter.js.map +1 -1
  109. package/out-tsc/src/sms/gsmvalidator.js +1 -1
  110. package/out-tsc/src/sms/gsmvalidator.js.map +1 -1
  111. package/out-tsc/src/sms/index.js +2 -2
  112. package/out-tsc/src/sms/index.js.map +1 -1
  113. package/out-tsc/src/sms/unicodesplitter.js +8 -8
  114. package/out-tsc/src/sms/unicodesplitter.js.map +1 -1
  115. package/out-tsc/src/store/Store.js +10 -10
  116. package/out-tsc/src/store/Store.js.map +1 -1
  117. package/out-tsc/src/store/StoreElement.js +2 -2
  118. package/out-tsc/src/store/StoreElement.js.map +1 -1
  119. package/out-tsc/src/tabpane/TabPane.js +4 -4
  120. package/out-tsc/src/tabpane/TabPane.js.map +1 -1
  121. package/out-tsc/src/templates/TemplateEditor.js +9 -9
  122. package/out-tsc/src/templates/TemplateEditor.js.map +1 -1
  123. package/out-tsc/src/textinput/TextInput.js +1 -1
  124. package/out-tsc/src/textinput/TextInput.js.map +1 -1
  125. package/out-tsc/src/thumbnail/Thumbnail.js +5 -5
  126. package/out-tsc/src/thumbnail/Thumbnail.js.map +1 -1
  127. package/out-tsc/src/tip/Tip.js +3 -3
  128. package/out-tsc/src/tip/Tip.js.map +1 -1
  129. package/out-tsc/src/toast/Toast.js +199 -0
  130. package/out-tsc/src/toast/Toast.js.map +1 -0
  131. package/out-tsc/src/utils/index.js +28 -21
  132. package/out-tsc/src/utils/index.js.map +1 -1
  133. package/out-tsc/src/vectoricon/VectorIcon.js +2 -2
  134. package/out-tsc/src/vectoricon/VectorIcon.js.map +1 -1
  135. package/out-tsc/src/vectoricon/index.js +1 -0
  136. package/out-tsc/src/vectoricon/index.js.map +1 -1
  137. package/out-tsc/src/webchat/WebChat.js +234 -81
  138. package/out-tsc/src/webchat/WebChat.js.map +1 -1
  139. package/out-tsc/src/webchat/assets.js +2 -0
  140. package/out-tsc/src/webchat/assets.js.map +1 -0
  141. package/out-tsc/src/webchat/index.js.map +1 -1
  142. package/out-tsc/temba-modules.js +2 -0
  143. package/out-tsc/temba-modules.js.map +1 -1
  144. package/out-tsc/test/temba-alert.test.js +1 -1
  145. package/out-tsc/test/temba-alert.test.js.map +1 -1
  146. package/out-tsc/test/temba-checkbox.test.js.map +1 -1
  147. package/out-tsc/test/temba-color-picker.test.js +4 -4
  148. package/out-tsc/test/temba-color-picker.test.js.map +1 -1
  149. package/out-tsc/test/temba-compose.test.js +50 -54
  150. package/out-tsc/test/temba-compose.test.js.map +1 -1
  151. package/out-tsc/test/temba-contact-badges.test.js +2 -2
  152. package/out-tsc/test/temba-contact-badges.test.js.map +1 -1
  153. package/out-tsc/test/temba-contact-chat.test.js +25 -38
  154. package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
  155. package/out-tsc/test/temba-contact-details.test.js +2 -2
  156. package/out-tsc/test/temba-contact-details.test.js.map +1 -1
  157. package/out-tsc/test/temba-contact-fields.test.js +4 -4
  158. package/out-tsc/test/temba-contact-fields.test.js.map +1 -1
  159. package/out-tsc/test/temba-contact-history.test.js +3 -3
  160. package/out-tsc/test/temba-contact-history.test.js.map +1 -1
  161. package/out-tsc/test/temba-contact-search.test.js +7 -7
  162. package/out-tsc/test/temba-contact-search.test.js.map +1 -1
  163. package/out-tsc/test/temba-contact-tickets.test.js +3 -3
  164. package/out-tsc/test/temba-contact-tickets.test.js.map +1 -1
  165. package/out-tsc/test/temba-content-menu.test.js +7 -7
  166. package/out-tsc/test/temba-content-menu.test.js.map +1 -1
  167. package/out-tsc/test/temba-date.test.js +3 -3
  168. package/out-tsc/test/temba-date.test.js.map +1 -1
  169. package/out-tsc/test/temba-datepicker.test.js +1 -1
  170. package/out-tsc/test/temba-datepicker.test.js.map +1 -1
  171. package/out-tsc/test/temba-field-manager.test.js +1 -3
  172. package/out-tsc/test/temba-field-manager.test.js.map +1 -1
  173. package/out-tsc/test/temba-label.test.js +6 -6
  174. package/out-tsc/test/temba-label.test.js.map +1 -1
  175. package/out-tsc/test/temba-lightbox.test.js +2 -2
  176. package/out-tsc/test/temba-lightbox.test.js.map +1 -1
  177. package/out-tsc/test/temba-list.test.js +6 -6
  178. package/out-tsc/test/temba-list.test.js.map +1 -1
  179. package/out-tsc/test/temba-menu.test.js +4 -5
  180. package/out-tsc/test/temba-menu.test.js.map +1 -1
  181. package/out-tsc/test/temba-modax.test.js +3 -3
  182. package/out-tsc/test/temba-modax.test.js.map +1 -1
  183. package/out-tsc/test/temba-options.test.js +1 -1
  184. package/out-tsc/test/temba-options.test.js.map +1 -1
  185. package/out-tsc/test/temba-select.test.js +17 -17
  186. package/out-tsc/test/temba-select.test.js.map +1 -1
  187. package/out-tsc/test/temba-sortable-list.test.js +1 -1
  188. package/out-tsc/test/temba-sortable-list.test.js.map +1 -1
  189. package/out-tsc/test/temba-textinput.test.js +2 -2
  190. package/out-tsc/test/temba-textinput.test.js.map +1 -1
  191. package/out-tsc/test/temba-tip.test.js +4 -4
  192. package/out-tsc/test/temba-tip.test.js.map +1 -1
  193. package/out-tsc/test/utils.test.js +8 -8
  194. package/out-tsc/test/utils.test.js.map +1 -1
  195. package/package.json +6 -15
  196. package/src/RapidElement.ts +3 -3
  197. package/src/ResizeElement.ts +2 -2
  198. package/src/aliaseditor/AliasEditor.ts +1 -2
  199. package/src/button/Button.ts +1 -1
  200. package/src/charcount/helpers.ts +1 -1
  201. package/src/colorpicker/ColorPicker.ts +4 -4
  202. package/src/completion/Completion.ts +2 -2
  203. package/src/completion/ExcellentParser.ts +1 -1
  204. package/src/completion/helpers.ts +9 -9
  205. package/src/compose/Compose.ts +18 -16
  206. package/src/contacts/ContactBadges.ts +2 -2
  207. package/src/contacts/ContactChat.ts +4 -4
  208. package/src/contacts/ContactDetails.ts +4 -4
  209. package/src/contacts/ContactFieldEditor.ts +4 -4
  210. package/src/contacts/ContactFields.ts +2 -2
  211. package/src/contacts/ContactHistory.ts +25 -22
  212. package/src/contacts/ContactPending.ts +4 -4
  213. package/src/contacts/ContactTickets.ts +9 -9
  214. package/src/contacts/events.ts +3 -3
  215. package/src/contacts/helpers.ts +2 -2
  216. package/src/contactsearch/ContactSearch.ts +9 -9
  217. package/src/date/TembaDate.ts +1 -1
  218. package/src/datepicker/DatePicker.ts +1 -1
  219. package/src/dialog/Dialog.ts +6 -6
  220. package/src/dialog/Modax.ts +8 -8
  221. package/src/dropdown/Dropdown.ts +1 -2
  222. package/src/emojis.json +1882 -1
  223. package/src/fields/FieldManager.ts +6 -7
  224. package/src/imagepicker/ImagePicker.ts +4 -4
  225. package/src/interfaces.ts +4 -4
  226. package/src/label/Label.ts +1 -1
  227. package/src/leafletmap/LeafletMap.ts +6 -6
  228. package/src/leafletmap/helpers.ts +2 -2
  229. package/src/lightbox/Lightbox.ts +2 -2
  230. package/src/list/ContentMenu.ts +9 -9
  231. package/src/list/RunList.ts +1 -1
  232. package/src/list/SortableList.ts +6 -6
  233. package/src/list/TembaList.ts +9 -7
  234. package/src/list/TembaMenu.ts +23 -23
  235. package/src/loading/Loading.ts +1 -1
  236. package/src/locales/es.ts +1 -1
  237. package/src/locales/fr.ts +1 -1
  238. package/src/locales/pt.ts +1 -1
  239. package/src/omnibox/Omnibox.ts +2 -2
  240. package/src/options/Options.ts +9 -9
  241. package/src/remote/Remote.ts +1 -1
  242. package/src/select/Select.ts +19 -19
  243. package/src/sms/gsmsplitter.ts +8 -8
  244. package/src/sms/gsmvalidator.ts +1 -1
  245. package/src/sms/index.ts +2 -2
  246. package/src/sms/unicodesplitter.ts +8 -8
  247. package/src/store/Store.ts +10 -10
  248. package/src/store/StoreElement.ts +2 -2
  249. package/src/tabpane/TabPane.ts +4 -4
  250. package/src/templates/TemplateEditor.ts +9 -9
  251. package/src/textinput/TextInput.ts +2 -2
  252. package/src/thumbnail/Thumbnail.ts +5 -5
  253. package/src/tip/Tip.ts +3 -3
  254. package/src/toast/Toast.ts +224 -0
  255. package/src/utils/index.ts +33 -24
  256. package/src/vectoricon/VectorIcon.ts +2 -2
  257. package/src/vectoricon/index.ts +2 -1
  258. package/src/webchat/WebChat.ts +272 -87
  259. package/src/webchat/assets.ts +2 -0
  260. package/src/webchat/index.ts +1 -1
  261. package/svg.js +28 -29
  262. package/temba-modules.ts +2 -0
  263. package/test/temba-alert.test.ts +1 -1
  264. package/test/temba-checkbox.test.ts +1 -1
  265. package/test/temba-color-picker.test.ts +4 -4
  266. package/test/temba-compose.test.ts +50 -55
  267. package/test/temba-contact-badges.test.ts +2 -2
  268. package/test/temba-contact-chat.test.ts +26 -46
  269. package/test/temba-contact-details.test.ts +2 -8
  270. package/test/temba-contact-fields.test.ts +4 -11
  271. package/test/temba-contact-history.test.ts +3 -3
  272. package/test/temba-contact-search.test.ts +7 -13
  273. package/test/temba-contact-tickets.test.ts +3 -3
  274. package/test/temba-content-menu.test.ts +7 -7
  275. package/test/temba-date.test.ts +3 -3
  276. package/test/temba-datepicker.test.ts +1 -1
  277. package/test/temba-field-manager.test.ts +1 -4
  278. package/test/temba-label.test.ts +6 -6
  279. package/test/temba-lightbox.test.ts +2 -2
  280. package/test/temba-list.test.ts +6 -6
  281. package/test/temba-menu.test.ts +4 -5
  282. package/test/temba-modax.test.ts +3 -3
  283. package/test/temba-options.test.ts +1 -1
  284. package/test/temba-select.test.ts +17 -17
  285. package/test/temba-sortable-list.test.ts +1 -1
  286. package/test/temba-textinput.test.ts +2 -2
  287. package/test/temba-tip.test.ts +5 -5
  288. package/test/utils.test.ts +8 -9
@@ -1 +1 @@
1
- {"version":3,"file":"ContactHistory.js","sourceRoot":"","sources":["../../../src/contacts/ContactHistory.ts"],"names":[],"mappings":"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","sourcesContent":["import { css } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { html, TemplateResult } from 'lit-html';\nimport { Contact, CustomEventType, Msg, Ticket } from '../interfaces';\nimport { RapidElement } from '../RapidElement';\nimport { Asset, getAssets, getClasses, postJSON, throttle } from '../utils';\n\nimport {\n AirtimeTransferredEvent,\n CampaignFiredEvent,\n ChannelEvent,\n ContactEvent,\n ContactGroupsEvent,\n ContactHistoryPage,\n ContactLanguageChangedEvent,\n EmailSentEvent,\n ErrorMessageEvent,\n EventGroup,\n Events,\n FlowEvent,\n getEventGroupType,\n getEventStyles,\n LabelsAddedEvent,\n MsgEvent,\n NameChangedEvent,\n OptinRequestedEvent,\n renderAirtimeTransferredEvent,\n renderCallStartedEvent,\n renderCampaignFiredEvent,\n renderChannelEvent,\n renderContactGroupsEvent,\n renderContactLanguageChangedEvent,\n renderContactURNsChanged,\n renderEmailSent,\n renderErrorMessage,\n renderFlowEvent,\n renderLabelsAdded,\n renderMsgEvent,\n renderNameChanged,\n renderNoteCreated,\n renderOptinRequested,\n renderResultEvent,\n renderTicketAction,\n renderTicketAssigned,\n renderTicketOpened,\n renderUpdateEvent,\n renderWebhookEvent,\n TicketEvent,\n UpdateFieldEvent,\n UpdateResultEvent,\n URNsChangedEvent,\n WebhookEvent,\n} from './events';\nimport {\n fetchContactHistory,\n MAX_CHAT_REFRESH,\n MIN_CHAT_REFRESH,\n SCROLL_THRESHOLD,\n} from './helpers';\nimport { Lightbox } from '../lightbox/Lightbox';\nimport { Store } from '../store/Store';\n\n// when images load, make sure we are on the bottom of the scroll window if necessary\nexport const loadHandler = function (event) {\n const target = event.target as HTMLElement;\n const events = this.host.getEventsPane();\n if (target.tagName == 'IMG') {\n if (!this.host.showMessageAlert) {\n if (\n events.scrollTop > target.offsetTop - 1000 &&\n target.offsetTop > events.scrollHeight - 500\n ) {\n this.host.scrollToBottom();\n }\n }\n }\n};\n\nexport class ContactHistory extends RapidElement {\n public httpComplete: Promise<void | ContactHistoryPage>;\n private store: Store;\n\n public constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.shadowRoot.addEventListener('load', loadHandler, true);\n this.store = document.querySelector('temba-store') as Store;\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.shadowRoot.removeEventListener('load', loadHandler, true);\n }\n\n private getTicketForEvent(event: TicketEvent) {\n return this.getTicket((event as TicketEvent).ticket.uuid);\n }\n\n private getTicket(uuid: string) {\n return (this.tickets || []).find(ticket => ticket.uuid === uuid);\n }\n\n static get styles() {\n return css`\n ${getEventStyles()}\n\n .wrapper {\n border: 0px solid green;\n display: flex;\n flex-direction: column;\n align-items: items-stretch;\n flex-grow: 1;\n min-height: 0;\n }\n\n .events {\n overflow-y: scroll;\n overflow-x: hidden;\n background: #fff;\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n min-height: 0;\n padding-top: 3em;\n padding-bottom: 1em;\n }\n\n temba-loading {\n align-self: center;\n margin-top: 0.025em;\n position: absolute;\n z-index: 250;\n padding-top: 1em;\n }\n\n .new-messages-container {\n display: flex;\n z-index: 1;\n background: pink;\n margin-bottom: 0px;\n }\n\n .new-messages {\n pointer-events: none;\n margin: 0 auto;\n margin-top: 0em;\n margin-bottom: -2.5em;\n padding: 0.25em 1em;\n border-radius: var(--curvature);\n background: var(--color-primary-dark);\n color: var(--color-text-light);\n opacity: 0;\n cursor: pointer;\n transition: all var(--transition-speed) ease-in-out;\n box-shadow: rgb(0 0 0 / 15%) 0px 3px 3px 0px;\n }\n\n .new-messages.expanded {\n margin-top: -2.5em;\n margin-bottom: 0.5em;\n pointer-events: auto;\n opacity: 1;\n pointer: cursor;\n }\n\n .scroll-title {\n display: flex;\n flex-direction: column;\n z-index: 2;\n border-top-left-radius: var(--curvature);\n overflow: hidden;\n box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.15);\n background: rgb(240, 240, 240);\n padding: 1em 1.2em;\n font-size: 1.2em;\n font-weight: 400;\n }\n\n .attachment img {\n cursor: pointer;\n }\n `;\n }\n\n @property({ type: Object })\n contact: Contact;\n\n @property({ type: String })\n uuid: string;\n\n @property({ type: String })\n agent: string;\n\n @property({ type: Array })\n eventGroups: EventGroup[] = [];\n\n @property({ type: Boolean })\n refreshing = false;\n\n @property({ type: Boolean })\n fetching = false;\n\n @property({ type: Boolean })\n complete = false;\n\n @property({ type: String })\n endpoint: string;\n\n @property({ type: Boolean })\n debug = false;\n\n @property({ type: Boolean })\n showMessageAlert = false;\n\n @property({ attribute: false, type: Object })\n mostRecentEvent: ContactEvent;\n\n @property({ type: String })\n ticket: string = null;\n\n @property({ type: String })\n endDate: string = null;\n\n @property({ type: Array })\n tickets: Ticket[] = null;\n\n ticketEvents: { [uuid: string]: TicketEvent } = {};\n\n nextBefore: number;\n nextAfter: number;\n lastHeight = 0;\n lastRefreshAdded: number;\n refreshTimeout: any = null;\n empty = false;\n\n public firstUpdated(changedProperties: Map<string, any>) {\n super.firstUpdated(changedProperties);\n this.handleClose = this.handleClose.bind(this);\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // fire an event if we get a new event\n if (\n changedProperties.has('mostRecentEvent') &&\n changedProperties.get('mostRecentEvent') &&\n this.mostRecentEvent\n ) {\n this.fireCustomEvent(CustomEventType.Refreshed);\n }\n\n if (changedProperties.has('endDate')) {\n if (this.refreshTimeout && this.endDate) {\n window.clearTimeout(this.refreshTimeout);\n }\n }\n\n // if we don't have an endpoint infer one\n if (changedProperties.has('uuid')) {\n if (this.uuid == null) {\n this.reset();\n } else {\n const endpoint = `/contact/history/${this.uuid}/?_format=json`;\n\n if (this.endpoint !== endpoint) {\n this.reset();\n\n if (this.endDate) {\n const before = new Date(this.endDate);\n this.nextBefore = before.getTime() * 1000 + 1000;\n }\n\n this.endpoint = endpoint;\n this.refreshTickets();\n }\n }\n }\n\n if (changedProperties.has('ticket')) {\n this.endpoint = null;\n this.requestUpdate('uuid');\n }\n\n if (\n changedProperties.has('refreshing') &&\n this.refreshing &&\n this.endpoint &&\n !this.endDate\n ) {\n const after = (this.getLastEventTime() - 1) * 1000;\n let forceOpen = false;\n\n fetchContactHistory(false, this.endpoint, this.ticket, null, after)\n .then((results: ContactHistoryPage) => {\n if (results.events && results.events.length > 0) {\n this.updateMostRecent(results.events[0]);\n }\n\n // keep track of any ticket events\n results.events.forEach((event: ContactEvent) => {\n if (event.type === Events.TICKET_OPENED) {\n const ticketEvent = event as TicketEvent;\n this.ticketEvents[ticketEvent.ticket.uuid] = ticketEvent;\n }\n });\n\n const fetchedEvents = results.events.reverse();\n\n // dedupe any events we get from the server\n // TODO: perhaps make this a little less crazy\n let removed = 0;\n this.eventGroups.forEach(g => {\n const before = g.events.length;\n g.events = g.events.filter(\n prev =>\n !fetchedEvents.find(fetched => {\n return (\n prev.created_on == fetched.created_on &&\n prev.type === fetched.type\n );\n })\n );\n removed += before - g.events.length;\n });\n\n this.lastRefreshAdded = fetchedEvents.length - removed;\n\n // reflow our most recent event group in case it merges with our new groups\n const previousGroups = [...this.eventGroups];\n\n if (this.eventGroups.length > 0) {\n const sliced = previousGroups.splice(\n previousGroups.length - 1,\n 1\n )[0];\n\n forceOpen = sliced.open;\n fetchedEvents.splice(0, 0, ...sliced.events);\n }\n\n const grouped = this.getEventGroups(fetchedEvents);\n if (grouped.length) {\n if (forceOpen) {\n grouped[grouped.length - 1].open = forceOpen;\n }\n this.eventGroups = [...previousGroups, ...grouped];\n }\n this.refreshing = false;\n this.scheduleRefresh();\n })\n .catch(() => {\n this.refreshing = false;\n this.scheduleRefresh();\n });\n }\n\n if (changedProperties.has('fetching') && this.fetching) {\n if (!this.nextBefore) {\n this.nextBefore = new Date().getTime() * 1000 - 1000;\n }\n\n this.httpComplete = fetchContactHistory(\n this.empty,\n this.endpoint,\n this.ticket,\n this.nextBefore,\n this.nextAfter\n ).then((results: ContactHistoryPage) => {\n // see if we have a new event\n if (results.events && results.events.length > 0) {\n this.updateMostRecent(results.events[0]);\n\n // keep track of any ticket events\n results.events.forEach((event: ContactEvent) => {\n if (event.type === Events.TICKET_OPENED) {\n const ticketEvent = event as TicketEvent;\n this.ticketEvents[ticketEvent.ticket.uuid] = ticketEvent;\n }\n });\n }\n\n let forceOpen = false;\n const fetchedEvents = results.events ? results.events.reverse() : [];\n\n // reflow our last event group in case it merges with our new groups\n if (this.eventGroups.length > 0) {\n const sliced = this.eventGroups.splice(0, 1)[0];\n forceOpen = sliced.open;\n fetchedEvents.push(...sliced.events);\n }\n\n const grouped = this.getEventGroups(fetchedEvents);\n if (grouped.length) {\n if (forceOpen) {\n grouped[grouped.length - 1].open = forceOpen;\n }\n\n this.eventGroups = [...grouped, ...this.eventGroups];\n }\n\n if (results.next_before === this.nextBefore) {\n this.complete = true;\n }\n\n this.nextBefore = results.next_before;\n this.nextAfter = results.next_after;\n this.fetching = false;\n this.empty = false;\n });\n }\n\n if (changedProperties.has('refreshing') && !this.refreshing) {\n if (this.lastRefreshAdded > 0) {\n const events = this.getEventsPane();\n\n // if we are near the bottom, push us to the bottom to show new stuff\n if (this.lastHeight > 0) {\n const addedHeight = events.scrollHeight - this.lastHeight;\n\n const distanceFromBottom =\n events.scrollHeight -\n events.scrollTop -\n addedHeight -\n events.clientHeight;\n\n if (distanceFromBottom < 500) {\n this.scrollToBottom();\n } else {\n this.showMessageAlert = true;\n }\n }\n\n if (this.eventGroups.length > 0) {\n this.lastHeight = events.scrollHeight;\n }\n }\n }\n\n if (\n changedProperties.has('fetching') &&\n !this.fetching &&\n changedProperties.get('fetching') !== undefined\n ) {\n const events = this.getEventsPane();\n\n if (this.lastHeight && events.scrollHeight > this.lastHeight) {\n const scrollTop =\n events.scrollTop + events.scrollHeight - this.lastHeight;\n events.scrollTop = scrollTop;\n }\n\n // scroll to the bottom if it's our first fetch\n if (!this.lastHeight) {\n this.scrollToBottom();\n }\n\n // don't record our scroll height until we have history\n if (this.eventGroups.length > 0) {\n this.lastHeight = events.scrollHeight;\n }\n }\n\n if (changedProperties.has('endpoint') && this.endpoint) {\n this.fetching = true;\n this.empty = true;\n }\n }\n\n private refreshTickets() {\n if (this.ticket) {\n let url = `/api/v2/tickets.json?contact=${this.uuid}`;\n if (this.ticket) {\n url = `${url}&ticket=${this.ticket}`;\n }\n\n getAssets(url).then((tickets: Ticket[]) => {\n this.tickets = tickets.reverse();\n });\n }\n }\n\n public getEventsPane() {\n return this.getDiv('.events');\n }\n\n public scrollToBottom(smooth = false) {\n const events = this.getEventsPane();\n events.scrollTo({\n top: events.scrollHeight,\n behavior: smooth ? 'smooth' : 'auto',\n });\n this.showMessageAlert = false;\n\n window.setTimeout(() => {\n events.scrollTo({\n top: events.scrollHeight,\n behavior: smooth ? 'smooth' : 'auto',\n });\n }, 0);\n }\n\n public refresh(): void {\n this.scheduleRefresh(500);\n }\n\n private getEventGroups(events: ContactEvent[]): EventGroup[] {\n const grouped: EventGroup[] = [];\n let eventGroup: EventGroup = undefined;\n for (const event of events) {\n const currentEventGroupType = getEventGroupType(event, this.ticket);\n // see if we need a new event group\n if (!eventGroup || eventGroup.type !== currentEventGroupType) {\n // we have a new type, save our last group\n if (eventGroup) {\n grouped.push(eventGroup);\n }\n eventGroup = {\n open: false,\n events: [event],\n type: currentEventGroupType,\n };\n } else {\n // our event matches the current group, stuff it in there\n eventGroup.events.push(event);\n }\n }\n\n if (eventGroup && eventGroup.events.length > 0) {\n grouped.push(eventGroup);\n }\n return grouped;\n }\n\n private scheduleRefresh(wait = -1) {\n if (this.endDate) {\n return;\n }\n\n let refreshWait = wait;\n\n if (wait === -1) {\n const lastEventTime = this.getLastEventTime();\n refreshWait = Math.max(\n Math.min((new Date().getTime() - lastEventTime) / 2, MAX_CHAT_REFRESH),\n MIN_CHAT_REFRESH\n );\n }\n\n // cancel any outstanding timeout\n if (wait > -1 && this.refreshTimeout) {\n window.clearTimeout(this.refreshTimeout);\n }\n\n this.refreshTimeout = window.setTimeout(() => {\n if (this.refreshing) {\n this.scheduleRefresh();\n this.refreshing = false;\n } else {\n this.refreshing = true;\n }\n }, refreshWait);\n }\n\n private reset() {\n this.endpoint = null;\n this.tickets = null;\n this.ticketEvents = {};\n this.eventGroups = [];\n this.fetching = false;\n this.complete = false;\n this.nextBefore = null;\n this.nextAfter = null;\n this.lastHeight = 0;\n }\n\n private handleEventGroupShow(event: MouseEvent) {\n const grouping = event.currentTarget as HTMLDivElement;\n const groupIndex = parseInt(grouping.getAttribute('data-group-index'));\n const eventGroup =\n this.eventGroups[this.eventGroups.length - groupIndex - 1];\n eventGroup.open = true;\n this.requestUpdate('eventGroups');\n }\n\n private handleEventGroupHide(event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n const grouping = event.currentTarget as HTMLDivElement;\n const groupIndex = parseInt(grouping.getAttribute('data-group-index'));\n const eventGroup =\n this.eventGroups[this.eventGroups.length - groupIndex - 1];\n\n eventGroup.open = false;\n\n this.requestUpdate('eventGroups');\n }\n\n private handleScroll() {\n const events = this.getEventsPane();\n if (events.scrollTop <= SCROLL_THRESHOLD) {\n if (this.eventGroups.length > 0 && !this.fetching && !this.complete) {\n this.fetching = true;\n }\n }\n }\n\n private updateMostRecent(newEvent: ContactEvent) {\n if (\n !this.mostRecentEvent ||\n this.mostRecentEvent.type !== newEvent.type ||\n this.mostRecentEvent.created_on !== newEvent.created_on\n ) {\n this.mostRecentEvent = newEvent;\n }\n }\n\n private getLastEventTime(): number {\n const mostRecentGroup = this.eventGroups[this.eventGroups.length - 1];\n if (mostRecentGroup) {\n const mostRecentEvent =\n mostRecentGroup.events[mostRecentGroup.events.length - 1];\n return new Date(mostRecentEvent.created_on).getTime();\n }\n return 0;\n }\n\n public renderEvent(event: ContactEvent): any {\n switch (event.type) {\n case Events.IVR_CREATED:\n case Events.MESSAGE_CREATED:\n case Events.MESSAGE_RECEIVED:\n case Events.BROADCAST_CREATED:\n if ((event as MsgEvent).created_by) {\n (event as MsgEvent).created_by = this.store.getUser(\n (event as MsgEvent).created_by.email\n );\n }\n\n return renderMsgEvent(event as MsgEvent);\n\n case Events.FLOW_ENTERED:\n case Events.FLOW_EXITED:\n return renderFlowEvent(event as FlowEvent);\n\n case Events.RUN_RESULT_CHANGED:\n return renderResultEvent(event as UpdateResultEvent);\n\n case Events.CONTACT_FIELD_CHANGED:\n return renderUpdateEvent(event as UpdateFieldEvent);\n\n case Events.CONTACT_NAME_CHANGED:\n return renderNameChanged(event as NameChangedEvent);\n\n case Events.CONTACT_URNS_CHANGED:\n return renderContactURNsChanged(event as URNsChangedEvent);\n\n case Events.EMAIL_SENT:\n return renderEmailSent(event as EmailSentEvent);\n\n case Events.INPUT_LABELS_ADDED:\n return renderLabelsAdded(event as LabelsAddedEvent);\n\n case Events.TICKET_OPENED: {\n return renderTicketAction(event as TicketEvent, 'opened', !this.ticket);\n }\n case Events.TICKET_NOTE_ADDED:\n return renderNoteCreated(event as TicketEvent);\n\n case Events.TICKET_ASSIGNED:\n return renderTicketAssigned(event as TicketEvent);\n case Events.TICKET_REOPENED: {\n return renderTicketAction(\n event as TicketEvent,\n 'reopened',\n !this.ticket\n );\n }\n case Events.TICKET_CLOSED:\n return renderTicketAction(event as TicketEvent, 'closed', !this.ticket);\n\n case Events.ERROR:\n case Events.FAILURE:\n return renderErrorMessage(event as ErrorMessageEvent);\n case Events.CONTACT_GROUPS_CHANGED:\n return renderContactGroupsEvent(event as ContactGroupsEvent);\n case Events.WEBHOOK_CALLED:\n return renderWebhookEvent(event as WebhookEvent);\n case Events.AIRTIME_TRANSFERRED:\n return renderAirtimeTransferredEvent(event as AirtimeTransferredEvent);\n case Events.CALL_STARTED:\n return renderCallStartedEvent();\n case Events.CAMPAIGN_FIRED:\n return renderCampaignFiredEvent(event as CampaignFiredEvent);\n case Events.CHANNEL_EVENT:\n return renderChannelEvent(event as ChannelEvent);\n case Events.CONTACT_LANGUAGE_CHANGED:\n return renderContactLanguageChangedEvent(\n event as ContactLanguageChangedEvent\n );\n case Events.OPTIN_REQUESTED:\n return renderOptinRequested(event as OptinRequestedEvent);\n }\n\n return html`<temba-icon\n name=\"alert-triangle\"\n style=\"fill:var(--color-error)\"\n ></temba-icon>\n <div class=\"description\">${event.type}</div>`;\n }\n\n private handleClose(uuid: string) {\n this.httpComplete = postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'close',\n })\n .then(() => {\n this.refreshTickets();\n this.refresh();\n this.fireCustomEvent(CustomEventType.ContentChanged, {\n ticket: { uuid, status: 'closed' },\n });\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n public checkForAgentAssignmentEvent(agent: string) {\n this.httpComplete = getAssets(\n `/api/v2/tickets.json?uuid=${this.ticket}`\n ).then((assets: Asset[]) => {\n if (assets.length === 1) {\n const ticket = assets[0] as Ticket;\n if (ticket.assignee && ticket.assignee.email === agent) {\n this.fireCustomEvent(CustomEventType.ContentChanged, {\n ticket: { uuid: this.ticket, assigned: 'self' },\n });\n } else {\n this.fireCustomEvent(CustomEventType.ContentChanged, {\n ticket: {\n uuid: this.ticket,\n assigned: ticket.assignee ? ticket.assignee : null,\n },\n });\n }\n }\n });\n }\n\n public getEventHandlers() {\n return [\n {\n event: 'scroll',\n method: throttle(this.handleScroll, 50),\n },\n ];\n }\n\n /** Check if a ticket event is no longer represented in a session */\n private isPurged(ticket: Ticket): boolean {\n return !this.ticketEvents[ticket.uuid];\n }\n\n private handleEventClicked(event) {\n const ele = event.target as HTMLDivElement;\n if (ele.tagName == 'IMG') {\n // if we have one, show in our lightbox\n const lightbox = document.querySelector('temba-lightbox') as Lightbox;\n if (lightbox) {\n lightbox.showElement(ele);\n }\n }\n }\n\n private renderEventContainer(event: ContactEvent) {\n const renderedEvent = html`\n <div\n @click=${this.handleEventClicked}\n class=\"${this.ticket ? 'active-ticket' : ''} event ${event.type}\"\n >\n ${this.renderEvent(event)}\n </div>\n ${this.debug ? html`<pre>${JSON.stringify(event, null, 2)}</pre>` : null}\n `;\n return renderedEvent;\n }\n\n public render(): TemplateResult {\n return html`\n ${\n this.fetching\n ? html`<temba-loading units=\"5\" size=\"10\"></temba-loading>`\n : html`<div style=\"height:0em\"></div>`\n }\n <div class=\"events\" @scroll=${this.handleScroll}>\n ${this.eventGroups.map((eventGroup: EventGroup, index: number) => {\n const grouping = getEventGroupType(eventGroup.events[0], this.ticket);\n const groupIndex = this.eventGroups.length - index - 1;\n\n const classes = getClasses({\n grouping: true,\n [grouping]: true,\n expanded: eventGroup.open,\n });\n return html`<div class=\"${classes}\">\n ${grouping === 'verbose'\n ? html`<div\n class=\"event-count\"\n @click=${this.handleEventGroupShow}\n data-group-index=\"${groupIndex}\"\n >\n ${eventGroup.open\n ? html`<temba-icon\n @click=${this.handleEventGroupHide}\n data-group-index=\"${groupIndex}\"\n name=\"x\"\n clickable\n ></temba-icon>`\n : html`${eventGroup.events.length}\n ${eventGroup.events.length === 1\n ? html`event`\n : html`events`} `}\n </div>`\n : null}\n\n <div class=\"items\">\n ${eventGroup.events.map((event: ContactEvent) => {\n if (\n event.type === Events.TICKET_ASSIGNED &&\n (event as TicketEvent).note\n ) {\n const noteEvent = { ...event };\n noteEvent.type = Events.TICKET_NOTE_ADDED;\n\n return html`${this.renderEventContainer(\n noteEvent\n )}${this.renderEventContainer(event)}`;\n } else {\n return this.renderEventContainer(event);\n }\n })}\n </div>\n </div>`;\n })}\n </div>\n\n ${\n this.contact && this.contact.status === 'active'\n ? html`<div class=\"new-messages-container\">\n <div\n @click=${() => {\n this.scrollToBottom(true);\n }}\n class=\"new-messages ${getClasses({\n expanded: this.showMessageAlert,\n })}\"\n >\n New Messages\n </div>\n </div>`\n : null\n }\n \n </div>\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"ContactHistory.js","sourceRoot":"","sources":["../../../src/contacts/ContactHistory.ts"],"names":[],"mappings":"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","sourcesContent":["import { css } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { html, TemplateResult } from 'lit-html';\nimport { Contact, CustomEventType, Ticket } from '../interfaces';\nimport { RapidElement } from '../RapidElement';\nimport { Asset, getAssets, getClasses, postJSON, throttle } from '../utils';\n\nimport {\n AirtimeTransferredEvent,\n CampaignFiredEvent,\n ChannelEvent,\n ContactEvent,\n ContactGroupsEvent,\n ContactHistoryPage,\n ContactLanguageChangedEvent,\n EmailSentEvent,\n ErrorMessageEvent,\n EventGroup,\n Events,\n FlowEvent,\n getEventGroupType,\n getEventStyles,\n LabelsAddedEvent,\n MsgEvent,\n NameChangedEvent,\n OptinRequestedEvent,\n renderAirtimeTransferredEvent,\n renderCallStartedEvent,\n renderCampaignFiredEvent,\n renderChannelEvent,\n renderContactGroupsEvent,\n renderContactLanguageChangedEvent,\n renderContactURNsChanged,\n renderEmailSent,\n renderErrorMessage,\n renderFlowEvent,\n renderLabelsAdded,\n renderMsgEvent,\n renderNameChanged,\n renderNoteCreated,\n renderOptinRequested,\n renderResultEvent,\n renderTicketAction,\n renderTicketAssigned,\n renderUpdateEvent,\n renderWebhookEvent,\n TicketEvent,\n UpdateFieldEvent,\n UpdateResultEvent,\n URNsChangedEvent,\n WebhookEvent\n} from './events';\nimport {\n fetchContactHistory,\n MAX_CHAT_REFRESH,\n MIN_CHAT_REFRESH,\n SCROLL_THRESHOLD\n} from './helpers';\nimport { Lightbox } from '../lightbox/Lightbox';\nimport { Store } from '../store/Store';\n\n// when images load, make sure we are on the bottom of the scroll window if necessary\nexport const loadHandler = function (event) {\n const target = event.target as HTMLElement;\n const events = this.host.getEventsPane();\n if (target.tagName == 'IMG') {\n if (!this.host.showMessageAlert) {\n if (\n events.scrollTop > target.offsetTop - 1000 &&\n target.offsetTop > events.scrollHeight - 500\n ) {\n this.host.scrollToBottom();\n }\n }\n }\n};\n\nexport class ContactHistory extends RapidElement {\n public httpComplete: Promise<void | ContactHistoryPage>;\n private store: Store;\n\n public constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.shadowRoot.addEventListener('load', loadHandler, true);\n this.store = document.querySelector('temba-store') as Store;\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.shadowRoot.removeEventListener('load', loadHandler, true);\n }\n\n private getTicketForEvent(event: TicketEvent) {\n return this.getTicket((event as TicketEvent).ticket.uuid);\n }\n\n private getTicket(uuid: string) {\n return (this.tickets || []).find((ticket) => ticket.uuid === uuid);\n }\n\n static get styles() {\n return css`\n ${getEventStyles()}\n\n .wrapper {\n border: 0px solid green;\n display: flex;\n flex-direction: column;\n align-items: items-stretch;\n flex-grow: 1;\n min-height: 0;\n }\n\n .events {\n overflow-y: scroll;\n overflow-x: hidden;\n background: #fff;\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n min-height: 0;\n padding-top: 3em;\n padding-bottom: 1em;\n }\n\n temba-loading {\n align-self: center;\n margin-top: 0.025em;\n position: absolute;\n z-index: 250;\n padding-top: 1em;\n }\n\n .new-messages-container {\n display: flex;\n z-index: 1;\n background: pink;\n margin-bottom: 0px;\n }\n\n .new-messages {\n pointer-events: none;\n margin: 0 auto;\n margin-top: 0em;\n margin-bottom: -2.5em;\n padding: 0.25em 1em;\n border-radius: var(--curvature);\n background: var(--color-primary-dark);\n color: var(--color-text-light);\n opacity: 0;\n cursor: pointer;\n transition: all var(--transition-speed) ease-in-out;\n box-shadow: rgb(0 0 0 / 15%) 0px 3px 3px 0px;\n }\n\n .new-messages.expanded {\n margin-top: -2.5em;\n margin-bottom: 0.5em;\n pointer-events: auto;\n opacity: 1;\n pointer: cursor;\n }\n\n .scroll-title {\n display: flex;\n flex-direction: column;\n z-index: 2;\n border-top-left-radius: var(--curvature);\n overflow: hidden;\n box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.15);\n background: rgb(240, 240, 240);\n padding: 1em 1.2em;\n font-size: 1.2em;\n font-weight: 400;\n }\n\n .attachment img {\n cursor: pointer;\n }\n `;\n }\n\n @property({ type: Object })\n contact: Contact;\n\n @property({ type: String })\n uuid: string;\n\n @property({ type: String })\n agent: string;\n\n @property({ type: Array })\n eventGroups: EventGroup[] = [];\n\n @property({ type: Boolean })\n refreshing = false;\n\n @property({ type: Boolean })\n fetching = false;\n\n @property({ type: Boolean })\n complete = false;\n\n @property({ type: String })\n endpoint: string;\n\n @property({ type: Boolean })\n debug = false;\n\n @property({ type: Boolean })\n showMessageAlert = false;\n\n @property({ attribute: false, type: Object })\n mostRecentEvent: ContactEvent;\n\n @property({ type: String })\n ticket: string = null;\n\n @property({ type: String })\n endDate: string = null;\n\n @property({ type: Array })\n tickets: Ticket[] = null;\n\n ticketEvents: { [uuid: string]: TicketEvent } = {};\n\n nextBefore: number;\n nextAfter: number;\n lastHeight = 0;\n lastRefreshAdded: number;\n refreshTimeout: any = null;\n empty = false;\n\n public firstUpdated(changedProperties: Map<string, any>) {\n super.firstUpdated(changedProperties);\n this.handleClose = this.handleClose.bind(this);\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // fire an event if we get a new event\n if (\n changedProperties.has('mostRecentEvent') &&\n changedProperties.get('mostRecentEvent') &&\n this.mostRecentEvent\n ) {\n this.fireCustomEvent(CustomEventType.Refreshed);\n }\n\n if (changedProperties.has('endDate')) {\n if (this.refreshTimeout && this.endDate) {\n window.clearTimeout(this.refreshTimeout);\n }\n }\n\n // if we don't have an endpoint infer one\n if (changedProperties.has('uuid')) {\n if (this.uuid == null) {\n this.reset();\n } else {\n const endpoint = `/contact/history/${this.uuid}/?_format=json`;\n\n if (this.endpoint !== endpoint) {\n this.reset();\n\n if (this.endDate) {\n const before = new Date(this.endDate);\n this.nextBefore = before.getTime() * 1000 + 1000;\n }\n\n this.endpoint = endpoint;\n this.refreshTickets();\n }\n }\n }\n\n if (changedProperties.has('ticket')) {\n this.endpoint = null;\n this.requestUpdate('uuid');\n }\n\n if (\n changedProperties.has('refreshing') &&\n this.refreshing &&\n this.endpoint &&\n !this.endDate\n ) {\n const after = (this.getLastEventTime() - 1) * 1000;\n let forceOpen = false;\n\n fetchContactHistory(false, this.endpoint, this.ticket, null, after)\n .then((results: ContactHistoryPage) => {\n if (results.events && results.events.length > 0) {\n this.updateMostRecent(results.events[0]);\n }\n\n // keep track of any ticket events\n results.events.forEach((event: ContactEvent) => {\n if (event.type === Events.TICKET_OPENED) {\n const ticketEvent = event as TicketEvent;\n this.ticketEvents[ticketEvent.ticket.uuid] = ticketEvent;\n }\n });\n\n const fetchedEvents = results.events.reverse();\n\n // dedupe any events we get from the server\n // TODO: perhaps make this a little less crazy\n let removed = 0;\n this.eventGroups.forEach((g) => {\n const before = g.events.length;\n g.events = g.events.filter(\n (prev) =>\n !fetchedEvents.find((fetched) => {\n return (\n prev.created_on == fetched.created_on &&\n prev.type === fetched.type\n );\n })\n );\n removed += before - g.events.length;\n });\n\n this.lastRefreshAdded = fetchedEvents.length - removed;\n\n // reflow our most recent event group in case it merges with our new groups\n const previousGroups = [...this.eventGroups];\n\n if (this.eventGroups.length > 0) {\n const sliced = previousGroups.splice(\n previousGroups.length - 1,\n 1\n )[0];\n\n forceOpen = sliced.open;\n if (sliced.events.length > 0) {\n fetchedEvents.splice(0, 0, ...sliced.events);\n }\n }\n\n const grouped = this.getEventGroups(fetchedEvents);\n if (grouped.length) {\n if (forceOpen) {\n grouped[grouped.length - 1].open = forceOpen;\n }\n this.eventGroups = [...previousGroups, ...grouped].filter(\n (group) => group.events.length > 0\n );\n }\n this.refreshing = false;\n this.scheduleRefresh();\n })\n .catch(() => {\n this.refreshing = false;\n this.scheduleRefresh();\n });\n }\n\n if (changedProperties.has('fetching') && this.fetching) {\n if (!this.nextBefore) {\n this.nextBefore = new Date().getTime() * 1000 - 1000;\n }\n\n this.httpComplete = fetchContactHistory(\n this.empty,\n this.endpoint,\n this.ticket,\n this.nextBefore,\n this.nextAfter\n ).then((results: ContactHistoryPage) => {\n // see if we have a new event\n if (results.events && results.events.length > 0) {\n this.updateMostRecent(results.events[0]);\n\n // keep track of any ticket events\n results.events.forEach((event: ContactEvent) => {\n if (event.type === Events.TICKET_OPENED) {\n const ticketEvent = event as TicketEvent;\n this.ticketEvents[ticketEvent.ticket.uuid] = ticketEvent;\n }\n });\n }\n\n let forceOpen = false;\n const fetchedEvents = results.events ? results.events.reverse() : [];\n\n // reflow our last event group in case it merges with our new groups\n if (this.eventGroups.length > 0) {\n const sliced = this.eventGroups.splice(0, 1)[0];\n forceOpen = sliced.open;\n fetchedEvents.push(...sliced.events);\n }\n\n const grouped = this.getEventGroups(fetchedEvents);\n if (grouped.length) {\n if (forceOpen) {\n grouped[grouped.length - 1].open = forceOpen;\n }\n\n this.eventGroups = [...grouped, ...this.eventGroups];\n }\n\n if (results.next_before === this.nextBefore) {\n this.complete = true;\n }\n\n this.nextBefore = results.next_before;\n this.nextAfter = results.next_after;\n this.fetching = false;\n this.empty = false;\n });\n }\n\n if (changedProperties.has('refreshing') && !this.refreshing) {\n if (this.lastRefreshAdded > 0) {\n const events = this.getEventsPane();\n\n // if we are near the bottom, push us to the bottom to show new stuff\n if (this.lastHeight > 0) {\n const addedHeight = events.scrollHeight - this.lastHeight;\n\n const distanceFromBottom =\n events.scrollHeight -\n events.scrollTop -\n addedHeight -\n events.clientHeight;\n\n if (distanceFromBottom < 500) {\n this.scrollToBottom();\n } else {\n this.showMessageAlert = true;\n }\n }\n\n if (this.eventGroups.length > 0) {\n this.lastHeight = events.scrollHeight;\n }\n }\n }\n\n if (\n changedProperties.has('fetching') &&\n !this.fetching &&\n changedProperties.get('fetching') !== undefined\n ) {\n const events = this.getEventsPane();\n\n if (this.lastHeight && events.scrollHeight > this.lastHeight) {\n const scrollTop =\n events.scrollTop + events.scrollHeight - this.lastHeight;\n events.scrollTop = scrollTop;\n }\n\n // scroll to the bottom if it's our first fetch\n if (!this.lastHeight) {\n this.scrollToBottom();\n }\n\n // don't record our scroll height until we have history\n if (this.eventGroups.length > 0) {\n this.lastHeight = events.scrollHeight;\n }\n }\n\n if (changedProperties.has('endpoint') && this.endpoint) {\n this.fetching = true;\n this.empty = true;\n }\n }\n\n private refreshTickets() {\n if (this.ticket) {\n let url = `/api/v2/tickets.json?contact=${this.uuid}`;\n if (this.ticket) {\n url = `${url}&ticket=${this.ticket}`;\n }\n\n getAssets(url).then((tickets: Ticket[]) => {\n this.tickets = tickets.reverse();\n });\n }\n }\n\n public getEventsPane() {\n return this.getDiv('.events');\n }\n\n public scrollToBottom(smooth = false) {\n const events = this.getEventsPane();\n events.scrollTo({\n top: events.scrollHeight,\n behavior: smooth ? 'smooth' : 'auto'\n });\n this.showMessageAlert = false;\n\n window.setTimeout(() => {\n events.scrollTo({\n top: events.scrollHeight,\n behavior: smooth ? 'smooth' : 'auto'\n });\n }, 0);\n }\n\n public refresh(): void {\n this.scheduleRefresh(500);\n }\n\n private getEventGroups(events: ContactEvent[]): EventGroup[] {\n const grouped: EventGroup[] = [];\n let eventGroup: EventGroup = undefined;\n for (const event of events) {\n const currentEventGroupType = getEventGroupType(event, this.ticket);\n // see if we need a new event group\n if (!eventGroup || eventGroup.type !== currentEventGroupType) {\n // we have a new type, save our last group\n if (eventGroup) {\n grouped.push(eventGroup);\n }\n eventGroup = {\n open: false,\n events: [event],\n type: currentEventGroupType\n };\n } else {\n // our event matches the current group, stuff it in there\n eventGroup.events.push(event);\n }\n }\n\n if (eventGroup && eventGroup.events.length > 0) {\n grouped.push(eventGroup);\n }\n return grouped;\n }\n\n private scheduleRefresh(wait = -1) {\n if (this.endDate) {\n return;\n }\n\n let refreshWait = wait;\n\n if (wait === -1) {\n const lastEventTime = this.getLastEventTime();\n refreshWait = Math.max(\n Math.min((new Date().getTime() - lastEventTime) / 2, MAX_CHAT_REFRESH),\n MIN_CHAT_REFRESH\n );\n }\n\n // cancel any outstanding timeout\n if (wait > -1 && this.refreshTimeout) {\n window.clearTimeout(this.refreshTimeout);\n }\n\n this.refreshTimeout = window.setTimeout(() => {\n if (this.refreshing) {\n this.scheduleRefresh();\n this.refreshing = false;\n } else {\n this.refreshing = true;\n }\n }, refreshWait);\n }\n\n private reset() {\n this.endpoint = null;\n this.tickets = null;\n this.ticketEvents = {};\n this.eventGroups = [];\n this.fetching = false;\n this.complete = false;\n this.nextBefore = null;\n this.nextAfter = null;\n this.lastHeight = 0;\n }\n\n private handleEventGroupShow(event: MouseEvent) {\n const grouping = event.currentTarget as HTMLDivElement;\n const groupIndex = parseInt(grouping.getAttribute('data-group-index'));\n const eventGroup =\n this.eventGroups[this.eventGroups.length - groupIndex - 1];\n eventGroup.open = true;\n this.requestUpdate('eventGroups');\n }\n\n private handleEventGroupHide(event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n const grouping = event.currentTarget as HTMLDivElement;\n const groupIndex = parseInt(grouping.getAttribute('data-group-index'));\n const eventGroup =\n this.eventGroups[this.eventGroups.length - groupIndex - 1];\n\n eventGroup.open = false;\n\n this.requestUpdate('eventGroups');\n }\n\n private handleScroll() {\n const events = this.getEventsPane();\n if (events.scrollTop <= SCROLL_THRESHOLD) {\n if (this.eventGroups.length > 0 && !this.fetching && !this.complete) {\n this.fetching = true;\n }\n }\n }\n\n private updateMostRecent(newEvent: ContactEvent) {\n if (\n !this.mostRecentEvent ||\n this.mostRecentEvent.type !== newEvent.type ||\n this.mostRecentEvent.created_on !== newEvent.created_on\n ) {\n this.mostRecentEvent = newEvent;\n }\n }\n\n private getLastEventTime(): number {\n const mostRecentGroup = this.eventGroups[this.eventGroups.length - 1];\n if (mostRecentGroup) {\n const mostRecentEvent =\n mostRecentGroup.events[mostRecentGroup.events.length - 1];\n return new Date(mostRecentEvent.created_on).getTime();\n }\n return 0;\n }\n\n public renderEvent(event: ContactEvent): any {\n switch (event.type) {\n case Events.IVR_CREATED:\n case Events.MESSAGE_CREATED:\n case Events.MESSAGE_RECEIVED:\n case Events.BROADCAST_CREATED:\n if ((event as MsgEvent).created_by) {\n (event as MsgEvent).created_by = this.store.getUser(\n (event as MsgEvent).created_by.email\n );\n }\n\n return renderMsgEvent(event as MsgEvent);\n\n case Events.FLOW_ENTERED:\n case Events.FLOW_EXITED:\n return renderFlowEvent(event as FlowEvent);\n\n case Events.RUN_RESULT_CHANGED:\n return renderResultEvent(event as UpdateResultEvent);\n\n case Events.CONTACT_FIELD_CHANGED:\n return renderUpdateEvent(event as UpdateFieldEvent);\n\n case Events.CONTACT_NAME_CHANGED:\n return renderNameChanged(event as NameChangedEvent);\n\n case Events.CONTACT_URNS_CHANGED:\n return renderContactURNsChanged(event as URNsChangedEvent);\n\n case Events.EMAIL_SENT:\n return renderEmailSent(event as EmailSentEvent);\n\n case Events.INPUT_LABELS_ADDED:\n return renderLabelsAdded(event as LabelsAddedEvent);\n\n case Events.TICKET_OPENED: {\n return renderTicketAction(event as TicketEvent, 'opened', !this.ticket);\n }\n case Events.TICKET_NOTE_ADDED:\n return renderNoteCreated(event as TicketEvent);\n\n case Events.TICKET_ASSIGNED:\n return renderTicketAssigned(event as TicketEvent);\n case Events.TICKET_REOPENED: {\n return renderTicketAction(\n event as TicketEvent,\n 'reopened',\n !this.ticket\n );\n }\n case Events.TICKET_CLOSED:\n return renderTicketAction(event as TicketEvent, 'closed', !this.ticket);\n\n case Events.ERROR:\n case Events.FAILURE:\n return renderErrorMessage(event as ErrorMessageEvent);\n case Events.CONTACT_GROUPS_CHANGED:\n return renderContactGroupsEvent(event as ContactGroupsEvent);\n case Events.WEBHOOK_CALLED:\n return renderWebhookEvent(event as WebhookEvent);\n case Events.AIRTIME_TRANSFERRED:\n return renderAirtimeTransferredEvent(event as AirtimeTransferredEvent);\n case Events.CALL_STARTED:\n return renderCallStartedEvent();\n case Events.CAMPAIGN_FIRED:\n return renderCampaignFiredEvent(event as CampaignFiredEvent);\n case Events.CHANNEL_EVENT:\n return renderChannelEvent(event as ChannelEvent);\n case Events.CONTACT_LANGUAGE_CHANGED:\n return renderContactLanguageChangedEvent(\n event as ContactLanguageChangedEvent\n );\n case Events.OPTIN_REQUESTED:\n return renderOptinRequested(event as OptinRequestedEvent);\n }\n\n return html`<temba-icon\n name=\"alert-triangle\"\n style=\"fill:var(--color-error)\"\n ></temba-icon>\n <div class=\"description\">${event.type}</div>`;\n }\n\n private handleClose(uuid: string) {\n this.httpComplete = postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'close'\n })\n .then(() => {\n this.refreshTickets();\n this.refresh();\n this.fireCustomEvent(CustomEventType.ContentChanged, {\n ticket: { uuid, status: 'closed' }\n });\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n public checkForAgentAssignmentEvent(agent: string) {\n this.httpComplete = getAssets(\n `/api/v2/tickets.json?uuid=${this.ticket}`\n ).then((assets: Asset[]) => {\n if (assets.length === 1) {\n const ticket = assets[0] as Ticket;\n if (ticket.assignee && ticket.assignee.email === agent) {\n this.fireCustomEvent(CustomEventType.ContentChanged, {\n ticket: { uuid: this.ticket, assigned: 'self' }\n });\n } else {\n this.fireCustomEvent(CustomEventType.ContentChanged, {\n ticket: {\n uuid: this.ticket,\n assigned: ticket.assignee ? ticket.assignee : null\n }\n });\n }\n }\n });\n }\n\n public getEventHandlers() {\n return [\n {\n event: 'scroll',\n method: throttle(this.handleScroll, 50)\n }\n ];\n }\n\n /** Check if a ticket event is no longer represented in a session */\n private isPurged(ticket: Ticket): boolean {\n return !this.ticketEvents[ticket.uuid];\n }\n\n private handleEventClicked(event) {\n const ele = event.target as HTMLDivElement;\n if (ele.tagName == 'IMG') {\n // if we have one, show in our lightbox\n const lightbox = document.querySelector('temba-lightbox') as Lightbox;\n if (lightbox) {\n lightbox.showElement(ele);\n }\n }\n }\n\n private renderEventContainer(event: ContactEvent) {\n const renderedEvent = html`\n <div\n @click=${this.handleEventClicked}\n class=\"${this.ticket ? 'active-ticket' : ''} event ${event.type}\"\n >\n ${this.renderEvent(event)}\n </div>\n ${this.debug ? html`<pre>${JSON.stringify(event, null, 2)}</pre>` : null}\n `;\n return renderedEvent;\n }\n\n public render(): TemplateResult {\n return html`\n ${\n this.fetching\n ? html`<temba-loading units=\"5\" size=\"10\"></temba-loading>`\n : html`<div style=\"height:0em\"></div>`\n }\n <div class=\"events\" @scroll=${this.handleScroll}>\n ${this.eventGroups.map((eventGroup: EventGroup, index: number) => {\n const grouping = getEventGroupType(eventGroup.events[0], this.ticket);\n const groupIndex = this.eventGroups.length - index - 1;\n\n const classes = getClasses({\n grouping: true,\n [grouping]: true,\n expanded: eventGroup.open\n });\n return html`<div class=\"${classes}\">\n ${grouping === 'verbose'\n ? html`<div\n class=\"event-count\"\n @click=${this.handleEventGroupShow}\n data-group-index=\"${groupIndex}\"\n >\n ${eventGroup.open\n ? html`<temba-icon\n @click=${this.handleEventGroupHide}\n data-group-index=\"${groupIndex}\"\n name=\"x\"\n clickable\n ></temba-icon>`\n : html`${eventGroup.events.length}\n ${eventGroup.events.length === 1\n ? html`event`\n : html`events`} `}\n </div>`\n : null}\n\n <div class=\"items\">\n ${eventGroup.events.map((event: ContactEvent) => {\n if (\n event.type === Events.TICKET_ASSIGNED &&\n (event as TicketEvent).note\n ) {\n const noteEvent = { ...event };\n noteEvent.type = Events.TICKET_NOTE_ADDED;\n\n return html`${this.renderEventContainer(\n noteEvent\n )}${this.renderEventContainer(event)}`;\n } else {\n return this.renderEventContainer(event);\n }\n })}\n </div>\n </div>`;\n })}\n </div>\n\n ${\n this.contact && this.contact.status === 'active'\n ? html`<div class=\"new-messages-container\">\n <div\n @click=${() => {\n this.scrollToBottom(true);\n }}\n class=\"new-messages ${getClasses({\n expanded: this.showMessageAlert\n })}\"\n >\n New Messages\n </div>\n </div>`\n : null\n }\n \n </div>\n `;\n }\n}\n"]}
@@ -1,13 +1,13 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { css, html } from 'lit';
3
3
  import { property } from 'lit/decorators.js';
4
- import { CustomEventType, ScheduledEventType, } from '../interfaces';
4
+ import { CustomEventType, ScheduledEventType } from '../interfaces';
5
5
  import { StoreElement } from '../store/StoreElement';
6
6
  import { Icon } from '../vectoricon';
7
7
  const ICONS = {
8
8
  [ScheduledEventType.CampaignEvent]: Icon.campaign,
9
9
  [ScheduledEventType.ScheduledBroadcast]: Icon.message,
10
- [ScheduledEventType.ScheduledTrigger]: Icon.trigger,
10
+ [ScheduledEventType.ScheduledTrigger]: Icon.trigger
11
11
  };
12
12
  export class ContactPending extends StoreElement {
13
13
  static get styles() {
@@ -125,7 +125,7 @@ export class ContactPending extends StoreElement {
125
125
  this.REPEAT_PERIOD = {
126
126
  O: this.lang_once,
127
127
  D: this.lang_daily,
128
- W: this.lang_weekly,
128
+ W: this.lang_weekly
129
129
  };
130
130
  this.handleEventClicked = this.handleEventClicked.bind(this);
131
131
  }
@@ -202,7 +202,7 @@ export class ContactPending extends StoreElement {
202
202
  if (this.data) {
203
203
  if (this.data.length > 0) {
204
204
  return html `
205
- ${this.data.map(event => {
205
+ ${this.data.map((event) => {
206
206
  return this.renderEvent(event);
207
207
  })}
208
208
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"ContactPending.js","sourceRoot":"","sources":["../../../src/contacts/ContactPending.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport {\n CustomEventType,\n ScheduledEvent,\n ScheduledEventType,\n} from '../interfaces';\nimport { StoreElement } from '../store/StoreElement';\nimport { Icon } from '../vectoricon';\n\nconst ICONS = {\n [ScheduledEventType.CampaignEvent]: Icon.campaign,\n [ScheduledEventType.ScheduledBroadcast]: Icon.message,\n [ScheduledEventType.ScheduledTrigger]: Icon.trigger,\n};\n\nexport class ContactPending extends StoreElement {\n @property({ type: String })\n contact: string;\n\n @property({ type: Object, attribute: false })\n data: ScheduledEvent[];\n\n @property({ type: String })\n lang_weekly = 'Weekly';\n\n @property({ type: String })\n lang_daily = 'Daily';\n\n @property({ type: String })\n lang_once = 'Once';\n\n REPEAT_PERIOD = {\n O: this.lang_once,\n D: this.lang_daily,\n W: this.lang_weekly,\n };\n\n static get styles() {\n return css`\n :host {\n }\n\n a,\n .linked {\n color: var(--color-link-primary);\n cursor: pointer;\n }\n\n a:hover,\n .linked:hover {\n text-decoration: underline;\n color: var(--color-link-primary-hover);\n }\n\n .type {\n background: rgba(0, 0, 0, 0.02);\n padding: 1em;\n display: flex;\n align-self: stretch;\n --icon-color: rgba(50, 50, 50, 0.25);\n border-top-left-radius: var(--curvature);\n border-bottom-left-radius: var(--curvature);\n }\n\n .details {\n display: flex;\n flex-direction: column;\n padding: 0.5em 1em;\n flex-grow: 1;\n }\n\n .campaign {\n display: flex;\n color: var(--text-color);\n --icon-color: var(--text-color);\n align-self: center;\n white-space: nowrap;\n }\n\n .message {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n padding: 0.1em;\n }\n\n .event {\n margin-bottom: 0.5em;\n border-radius: var(--curvature);\n display: flex;\n flex-direction: row;\n align-items: center;\n box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.055),\n 0 0 0px 1px rgba(0, 0, 0, 0.02);\n }\n\n .event:hover {\n cursor: pointer;\n box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.055),\n 0 0 0px 2px var(--color-link-primary);\n }\n\n .time {\n white-space: nowrap;\n background: rgba(0, 0, 0, 0.02);\n border-top-right-radius: var(--curvature);\n border-bottom-right-radius: var(--curvature);\n display: flex;\n align-self: stretch;\n padding: 0 1em;\n min-width: 5em;\n }\n\n .duration {\n align-self: center;\n flex-grow: 1;\n text-align: center;\n }\n\n .flow {\n display: inline-block;\n }\n\n temba-tip {\n cursor: default;\n }\n\n .scheduled-by {\n font-size: 0.85em;\n display: flex;\n color: var(--text-color);\n --icon-color: var(--text-color);\n }\n\n .scheduled-by temba-icon {\n margin-right: 0.25em;\n }\n\n .scheduled-by .name {\n flex-grow: 1;\n }\n `;\n }\n\n constructor() {\n super();\n this.handleEventClicked = this.handleEventClicked.bind(this);\n }\n\n protected updated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changes);\n if (changes.has('contact')) {\n if (this.contact) {\n this.url = `/contact/scheduled/${this.contact}/`;\n } else {\n this.url = null;\n }\n }\n }\n\n public handleEventClicked(event: ScheduledEvent) {\n this.fireCustomEvent(CustomEventType.Selection, event);\n }\n\n public renderEvent(scheduledEvent: ScheduledEvent) {\n return html`\n <div\n class=\"event ${scheduledEvent.type}\"\n @click=\"${() => this.handleEventClicked(scheduledEvent)}\"\n >\n <div class=\"type\">\n <temba-icon\n size=\"2\"\n name=\"${scheduledEvent.message ? Icon.message : Icon.flow}\"\n ></temba-icon>\n </div>\n\n <div class=\"details\">\n <div>\n ${scheduledEvent.flow\n ? html` Start ${scheduledEvent.flow.name}`\n : null}\n ${scheduledEvent.message\n ? html` <div class=\"message\">${scheduledEvent.message}</div> `\n : null}\n </div>\n\n <div class=\"scheduled-by\">\n ${scheduledEvent.campaign\n ? html`<div style=\"display:flex\">\n <temba-icon name=\"${Icon.campaign}\"></temba-icon>\n <div class=\"name\">${scheduledEvent.campaign.name}</div>\n </div>`\n : html`\n ${scheduledEvent.type === ScheduledEventType.ScheduledTrigger\n ? html`<temba-icon\n name=\"${ICONS[scheduledEvent.type]}\"\n ></temba-icon>`\n : null}\n <div class=\"name\">\n ${this.REPEAT_PERIOD[scheduledEvent.repeat_period]}\n </div>\n `}\n </div>\n </div>\n\n <div class=\"time\">\n <div class=\"duration\">\n <temba-tip\n text=${this.store.formatDate(scheduledEvent.scheduled)}\n position=\"left\"\n >\n ${this.store.getShortDurationFromIso(scheduledEvent.scheduled)}\n </temba-tip>\n </div>\n </div>\n </div>\n `;\n }\n\n public render(): TemplateResult {\n if (this.data) {\n if (this.data.length > 0) {\n return html`\n ${this.data.map(event => {\n return this.renderEvent(event);\n })}\n `;\n } else {\n return html`<slot name=\"empty\"></slot>`;\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ContactPending.js","sourceRoot":"","sources":["../../../src/contacts/ContactPending.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAoC,MAAM,KAAK,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EACL,eAAe,EAEf,kBAAkB,EACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,KAAK,GAAG;IACZ,CAAC,kBAAkB,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,QAAQ;IACjD,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,OAAO;IACrD,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,OAAO;CACpD,CAAC;AAEF,MAAM,OAAO,cAAe,SAAQ,YAAY;IAsB9C,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAwGT,CAAC;IACJ,CAAC;IAED;QACE,KAAK,EAAE,CAAC;QA3HV,gBAAW,GAAG,QAAQ,CAAC;QAGvB,eAAU,GAAG,OAAO,CAAC;QAGrB,cAAS,GAAG,MAAM,CAAC;QAEnB,kBAAa,GAAG;YACd,CAAC,EAAE,IAAI,CAAC,SAAS;YACjB,CAAC,EAAE,IAAI,CAAC,UAAU;YAClB,CAAC,EAAE,IAAI,CAAC,WAAW;SACpB,CAAC;QAgHA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;IAES,OAAO,CACf,OAA0D;QAE1D,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,GAAG,GAAG,sBAAsB,IAAI,CAAC,OAAO,GAAG,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAEM,kBAAkB,CAAC,KAAqB;QAC7C,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAEM,WAAW,CAAC,cAA8B;QAC/C,OAAO,IAAI,CAAA;;uBAEQ,cAAc,CAAC,IAAI;kBACxB,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC;;;;;oBAK3C,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;;;;;;cAMvD,cAAc,CAAC,IAAI;YACnB,CAAC,CAAC,IAAI,CAAA,UAAU,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE;YAC1C,CAAC,CAAC,IAAI;cACN,cAAc,CAAC,OAAO;YACtB,CAAC,CAAC,IAAI,CAAA,yBAAyB,cAAc,CAAC,OAAO,SAAS;YAC9D,CAAC,CAAC,IAAI;;;;cAIN,cAAc,CAAC,QAAQ;YACvB,CAAC,CAAC,IAAI,CAAA;sCACkB,IAAI,CAAC,QAAQ;sCACb,cAAc,CAAC,QAAQ,CAAC,IAAI;uBAC3C;YACT,CAAC,CAAC,IAAI,CAAA;oBACA,cAAc,CAAC,IAAI,KAAK,kBAAkB,CAAC,gBAAgB;gBAC3D,CAAC,CAAC,IAAI,CAAA;gCACM,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC;qCACrB;gBACjB,CAAC,CAAC,IAAI;;sBAEJ,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,aAAa,CAAC;;iBAErD;;;;;;;qBAOI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC;;;gBAGpD,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,cAAc,CAAC,SAAS,CAAC;;;;;KAKvE,CAAC;IACJ,CAAC;IAEM,MAAM;QACX,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,IAAI,CAAA;YACP,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBACxB,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACjC,CAAC,CAAC;SACH,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAA,4BAA4B,CAAC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA3NC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;+CACX;AAGhB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;4CACtB;AAGvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDACJ;AAGvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDACN;AAGrB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iDACR","sourcesContent":["import { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport {\n CustomEventType,\n ScheduledEvent,\n ScheduledEventType\n} from '../interfaces';\nimport { StoreElement } from '../store/StoreElement';\nimport { Icon } from '../vectoricon';\n\nconst ICONS = {\n [ScheduledEventType.CampaignEvent]: Icon.campaign,\n [ScheduledEventType.ScheduledBroadcast]: Icon.message,\n [ScheduledEventType.ScheduledTrigger]: Icon.trigger\n};\n\nexport class ContactPending extends StoreElement {\n @property({ type: String })\n contact: string;\n\n @property({ type: Object, attribute: false })\n data: ScheduledEvent[];\n\n @property({ type: String })\n lang_weekly = 'Weekly';\n\n @property({ type: String })\n lang_daily = 'Daily';\n\n @property({ type: String })\n lang_once = 'Once';\n\n REPEAT_PERIOD = {\n O: this.lang_once,\n D: this.lang_daily,\n W: this.lang_weekly\n };\n\n static get styles() {\n return css`\n :host {\n }\n\n a,\n .linked {\n color: var(--color-link-primary);\n cursor: pointer;\n }\n\n a:hover,\n .linked:hover {\n text-decoration: underline;\n color: var(--color-link-primary-hover);\n }\n\n .type {\n background: rgba(0, 0, 0, 0.02);\n padding: 1em;\n display: flex;\n align-self: stretch;\n --icon-color: rgba(50, 50, 50, 0.25);\n border-top-left-radius: var(--curvature);\n border-bottom-left-radius: var(--curvature);\n }\n\n .details {\n display: flex;\n flex-direction: column;\n padding: 0.5em 1em;\n flex-grow: 1;\n }\n\n .campaign {\n display: flex;\n color: var(--text-color);\n --icon-color: var(--text-color);\n align-self: center;\n white-space: nowrap;\n }\n\n .message {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n padding: 0.1em;\n }\n\n .event {\n margin-bottom: 0.5em;\n border-radius: var(--curvature);\n display: flex;\n flex-direction: row;\n align-items: center;\n box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.055),\n 0 0 0px 1px rgba(0, 0, 0, 0.02);\n }\n\n .event:hover {\n cursor: pointer;\n box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.055),\n 0 0 0px 2px var(--color-link-primary);\n }\n\n .time {\n white-space: nowrap;\n background: rgba(0, 0, 0, 0.02);\n border-top-right-radius: var(--curvature);\n border-bottom-right-radius: var(--curvature);\n display: flex;\n align-self: stretch;\n padding: 0 1em;\n min-width: 5em;\n }\n\n .duration {\n align-self: center;\n flex-grow: 1;\n text-align: center;\n }\n\n .flow {\n display: inline-block;\n }\n\n temba-tip {\n cursor: default;\n }\n\n .scheduled-by {\n font-size: 0.85em;\n display: flex;\n color: var(--text-color);\n --icon-color: var(--text-color);\n }\n\n .scheduled-by temba-icon {\n margin-right: 0.25em;\n }\n\n .scheduled-by .name {\n flex-grow: 1;\n }\n `;\n }\n\n constructor() {\n super();\n this.handleEventClicked = this.handleEventClicked.bind(this);\n }\n\n protected updated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changes);\n if (changes.has('contact')) {\n if (this.contact) {\n this.url = `/contact/scheduled/${this.contact}/`;\n } else {\n this.url = null;\n }\n }\n }\n\n public handleEventClicked(event: ScheduledEvent) {\n this.fireCustomEvent(CustomEventType.Selection, event);\n }\n\n public renderEvent(scheduledEvent: ScheduledEvent) {\n return html`\n <div\n class=\"event ${scheduledEvent.type}\"\n @click=\"${() => this.handleEventClicked(scheduledEvent)}\"\n >\n <div class=\"type\">\n <temba-icon\n size=\"2\"\n name=\"${scheduledEvent.message ? Icon.message : Icon.flow}\"\n ></temba-icon>\n </div>\n\n <div class=\"details\">\n <div>\n ${scheduledEvent.flow\n ? html` Start ${scheduledEvent.flow.name}`\n : null}\n ${scheduledEvent.message\n ? html` <div class=\"message\">${scheduledEvent.message}</div> `\n : null}\n </div>\n\n <div class=\"scheduled-by\">\n ${scheduledEvent.campaign\n ? html`<div style=\"display:flex\">\n <temba-icon name=\"${Icon.campaign}\"></temba-icon>\n <div class=\"name\">${scheduledEvent.campaign.name}</div>\n </div>`\n : html`\n ${scheduledEvent.type === ScheduledEventType.ScheduledTrigger\n ? html`<temba-icon\n name=\"${ICONS[scheduledEvent.type]}\"\n ></temba-icon>`\n : null}\n <div class=\"name\">\n ${this.REPEAT_PERIOD[scheduledEvent.repeat_period]}\n </div>\n `}\n </div>\n </div>\n\n <div class=\"time\">\n <div class=\"duration\">\n <temba-tip\n text=${this.store.formatDate(scheduledEvent.scheduled)}\n position=\"left\"\n >\n ${this.store.getShortDurationFromIso(scheduledEvent.scheduled)}\n </temba-tip>\n </div>\n </div>\n </div>\n `;\n }\n\n public render(): TemplateResult {\n if (this.data) {\n if (this.data.length > 0) {\n return html`\n ${this.data.map((event) => {\n return this.renderEvent(event);\n })}\n `;\n } else {\n return html`<slot name=\"empty\"></slot>`;\n }\n }\n }\n}\n"]}
@@ -213,7 +213,7 @@ export class ContactTickets extends StoreElement {
213
213
  handleClose(uuid) {
214
214
  postJSON(`/api/v2/ticket_actions.json`, {
215
215
  tickets: [uuid],
216
- action: 'close',
216
+ action: 'close'
217
217
  })
218
218
  .then(() => {
219
219
  this.refresh();
@@ -225,7 +225,7 @@ export class ContactTickets extends StoreElement {
225
225
  handleReopen(uuid) {
226
226
  postJSON(`/api/v2/ticket_actions.json`, {
227
227
  tickets: [uuid],
228
- action: 'reopen',
228
+ action: 'reopen'
229
229
  })
230
230
  .then(() => {
231
231
  this.refresh();
@@ -236,7 +236,7 @@ export class ContactTickets extends StoreElement {
236
236
  }
237
237
  handleTicketAssignment(uuid, email) {
238
238
  // if its already assigned to use, it's a noop
239
- const ticket = this.data.find(ticket => ticket.uuid === uuid);
239
+ const ticket = this.data.find((ticket) => ticket.uuid === uuid);
240
240
  if (ticket.assignee && ticket.assignee.email === email) {
241
241
  return;
242
242
  }
@@ -244,7 +244,7 @@ export class ContactTickets extends StoreElement {
244
244
  postJSON(`/api/v2/ticket_actions.json`, {
245
245
  tickets: [uuid],
246
246
  action: 'assign',
247
- assignee: email,
247
+ assignee: email
248
248
  })
249
249
  .then(() => {
250
250
  this.refresh();
@@ -257,7 +257,7 @@ export class ContactTickets extends StoreElement {
257
257
  renderTicket(ticket) {
258
258
  const date = ticket.opened_on;
259
259
  const users = this.store.getAssignableUsers();
260
- const agent = users.find(user => user.email === this.agent);
260
+ const agent = users.find((user) => user.email === this.agent);
261
261
  return html `
262
262
  <div
263
263
  @click=${() => {
@@ -271,7 +271,7 @@ export class ContactTickets extends StoreElement {
271
271
  class="ticket ${ticket.status} ${getClasses({
272
272
  clickable: this.clickable,
273
273
  expandable: this.expandable,
274
- expanded: this.expanded,
274
+ expanded: this.expanded
275
275
  })}"
276
276
  >
277
277
  <div class="header">
@@ -374,7 +374,7 @@ export class ContactTickets extends StoreElement {
374
374
  : null}
375
375
 
376
376
  <div class="options option-group">
377
- ${this.store.getAssignableUsers().map(user => {
377
+ ${this.store.getAssignableUsers().map((user) => {
378
378
  if (ticket.assignee &&
379
379
  user.email === ticket.assignee.email) {
380
380
  return null;
@@ -425,7 +425,7 @@ export class ContactTickets extends StoreElement {
425
425
  }
426
426
  render() {
427
427
  if (this.data && this.data.length > 0) {
428
- const tickets = this.data.map(ticket => {
428
+ const tickets = this.data.map((ticket) => {
429
429
  return this.renderTicket(ticket);
430
430
  });
431
431
  return html `${tickets}`;
@@ -1 +1 @@
1
- {"version":3,"file":"ContactTickets.js","sourceRoot":"","sources":["../../../src/contacts/ContactTickets.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { CustomEventType, Ticket, TicketStatus, User } from '../interfaces';\nimport { StoreElement } from '../store/StoreElement';\nimport { getClasses, postJSON, stopEvent } from '../utils';\nimport { Icon } from '../vectoricon';\n\nconst dropdownUserScale = 0.7;\nconst inlineUserScale = 0.8;\n\nexport class ContactTickets extends StoreElement {\n @property({ type: String })\n agent: string;\n\n @property({ type: String })\n contact: string;\n\n @property({ type: String })\n ticket: string;\n\n @property({ type: Boolean })\n clickable = false;\n\n @property({ type: Boolean })\n expandable = false;\n\n @property({ type: Boolean })\n expanded = false;\n\n @property({ type: Object, attribute: false })\n data: Ticket[];\n\n static get styles() {\n return css`\n :host {\n }\n\n :hover {\n }\n\n .ticket.expandable:hover,\n .ticket.clickable:hover {\n cursor: pointer;\n box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.055),\n 0 0 0px 2px var(--color-link-primary);\n }\n\n .header {\n display: flex;\n flex-direction: row;\n flex-grow: 1;\n }\n\n .tickets {\n display: flex;\n flex-direction: column;\n padding: 0.3em 0.8em;\n }\n\n .count {\n margin-left: 0.5em;\n }\n\n .ticket {\n background: #fff;\n display: flex;\n flex-direction: column;\n margin-bottom: 0.5em;\n border-radius: var(--curvature);\n display: flex;\n flex-direction: column;\n align-items: stretch;\n box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.055),\n 0 0 0px 1px rgba(0, 0, 0, 0.02);\n transition: all 200ms ease-in-out;\n }\n\n .ticket .topic {\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0.5em 0.75em 0.5em 0.75em;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n flex-grow: 2;\n }\n\n .ticket .body {\n max-height: 0px;\n overflow-y: auto;\n -webkit-line-clamp: none;\n white-space: normal;\n width: initial;\n padding: 0.5em 0.75em 0em 0.75em;\n max-height: 40vh;\n display: none;\n margin-bottom: 0.5em;\n border-top: 1px solid #e6e6e6;\n }\n\n .ticket.expanded .body {\n display: block;\n }\n\n .status {\n --icon-color: #999;\n }\n\n .ticket.closed {\n background: #f9f9f9;\n color: #888;\n }\n\n .resolve {\n color: var(--color-primary-dark);\n }\n\n .dropdown {\n color: rgb(45, 45, 45);\n z-index: 50;\n width: 18em;\n }\n\n .option-group {\n padding: 0.4em;\n border-bottom: 1px solid #f3f3f3;\n }\n\n .option-group temba-user {\n flex-grow: 1;\n }\n\n .assigned .user {\n flex-grow: 1;\n }\n\n .assigned {\n display: flex;\n align-items: center;\n }\n\n .assigned temba-button {\n margin-right: 0.75em;\n }\n\n .assigned .user:hover {\n cursor: default;\n background: none;\n }\n\n .options {\n max-height: 40vh;\n overflow-y: auto;\n border-bottom: none;\n }\n\n .user {\n display: flex;\n align-items: center;\n border-radius: var(--curvature);\n cursor: pointer;\n }\n\n .user:hover {\n background: var(--color-selection);\n }\n\n .user .name {\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n flex-grow: 1;\n }\n\n .user temba-button {\n margin-left: 0.5em;\n }\n\n .current-user {\n font-weight: 400;\n }\n\n .details {\n display: flex;\n align-items: center;\n flex-shrink: 1;\n margin-right: 0.5em;\n }\n\n .details .date {\n padding: 0em 0.5em;\n }\n\n .details .toggle {\n padding-right: 0.5em;\n }\n `;\n }\n\n prepareData(data: any): any {\n if (data && data.length) {\n data.sort((a: Ticket, b: Ticket) => {\n if (a.status == TicketStatus.Open && b.status == TicketStatus.Closed) {\n return -1;\n }\n\n if (b.status == TicketStatus.Open && a.status == TicketStatus.Closed) {\n return 1;\n }\n\n if (\n a.status == TicketStatus.Closed &&\n b.status == TicketStatus.Closed\n ) {\n return (\n new Date(b.closed_on).getTime() - new Date(a.closed_on).getTime()\n );\n }\n\n return (\n new Date(b.opened_on).getTime() - new Date(a.opened_on).getTime()\n );\n });\n }\n return data;\n }\n\n protected updated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changes);\n if (changes.has('contact') || changes.has('ticket')) {\n if (this.contact) {\n this.url = `/api/v2/tickets.json?contact=${this.contact}${\n this.ticket ? '&ticket=' + this.ticket : ''\n }`;\n } else {\n this.url = null;\n }\n }\n }\n\n private handleClose(uuid: string) {\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'close',\n })\n .then(() => {\n this.refresh();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n private handleReopen(uuid: string) {\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'reopen',\n })\n .then(() => {\n this.refresh();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n public handleTicketAssignment(uuid: string, email: string) {\n // if its already assigned to use, it's a noop\n const ticket = this.data.find(ticket => ticket.uuid === uuid);\n if (ticket.assignee && ticket.assignee.email === email) {\n return;\n }\n this.blur();\n\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'assign',\n assignee: email,\n })\n .then(() => {\n this.refresh();\n })\n .catch((response: any) => {\n console.error(response);\n });\n return true;\n }\n\n public renderTicket(ticket: Ticket) {\n const date = ticket.opened_on;\n const users = this.store.getAssignableUsers();\n const agent = users.find(user => user.email === this.agent);\n return html`\n <div\n @click=${() => {\n if (this.clickable) {\n this.fireCustomEvent(CustomEventType.ButtonClicked, { ticket });\n } else if (this.expandable) {\n this.expanded = !this.expanded;\n }\n }}\n class=\"ticket ${ticket.status} ${getClasses({\n clickable: this.clickable,\n expandable: this.expandable,\n expanded: this.expanded,\n })}\"\n >\n <div class=\"header\">\n <div class=\"topic\">${ticket.topic.name}</div>\n\n <div class=\"details\">\n <div class=\"date\">\n <temba-date value=\"${date}\" display=\"duration\"></temba-date>\n </div>\n\n ${ticket.status === TicketStatus.Closed\n ? html`<div class=\"reopen\">\n <temba-button\n primary\n small\n name=\"Reopen\"\n @click=${(event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.handleReopen(ticket.uuid);\n }}\n ></temba-button>\n </div>`\n : html`\n <div>\n <temba-dropdown\n right\n arrowsize=\"8\"\n arrowoffset=\"-44\"\n offsety=\"8\"\n offsetx=${ticket.assignee ? -42 : -28}\n >\n <div slot=\"toggle\" class=\"toggle\">\n ${ticket.assignee\n ? html`\n <temba-user\n email=${ticket.assignee.email}\n scale=\"${inlineUserScale}\"\n ></temba-user>\n `\n : html`\n <temba-button\n name=\"Assign\"\n primary\n small\n ></temba-button>\n `}\n </div>\n\n <div\n slot=\"dropdown\"\n class=\"dropdown\"\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n }}\n >\n ${ticket.assignee\n ? html`\n <div\n class=\"assigned option-group ${agent &&\n ticket.assignee.email == agent.email\n ? 'current-user'\n : ''}\"\n >\n <temba-user\n email=${ticket.assignee.email}\n name\n scale=\"${dropdownUserScale}\"\n ></temba-user>\n <temba-button\n name=\"Unassign\"\n primary\n small\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n this.handleTicketAssignment(\n ticket.uuid,\n null\n );\n }}\n ></temba-button>\n </div>\n `\n : null}\n ${agent &&\n (!ticket.assignee ||\n agent.email !== ticket.assignee.email)\n ? html`\n <div\n class=\"current-user option-group\"\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n this.handleTicketAssignment(\n ticket.uuid,\n agent.email\n );\n }}\n >\n <temba-user\n email=${agent.email}\n name\n scale=\"${dropdownUserScale}\"\n ></temba-user>\n </div>\n `\n : null}\n\n <div class=\"options option-group\">\n ${this.store.getAssignableUsers().map(user => {\n if (\n ticket.assignee &&\n user.email === ticket.assignee.email\n ) {\n return null;\n }\n\n if (user.email === this.agent) {\n return null;\n }\n return html`<div\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n this.handleTicketAssignment(\n ticket.uuid,\n user.email\n );\n }}\n >\n <temba-user\n email=${user.email}\n scale=\"${dropdownUserScale}\"\n name\n ></temba-user>\n </div>`;\n })}\n </div>\n </div>\n </temba-dropdown>\n </div>\n <temba-tip\n text=\"Resolve\"\n position=\"left\"\n style=\"width:1.5em\"\n class=\"resolve\"\n >\n <temba-icon\n size=\"1.25\"\n name=\"${Icon.check}\"\n @click=${(event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.handleClose(ticket.uuid);\n }}\n ?clickable=${open}\n />\n </temba-tip>\n `}\n </div>\n </div>\n <div class=\"body\">${ticket.body}</div>\n </div>\n `;\n }\n\n public render(): TemplateResult {\n if (this.data && this.data.length > 0) {\n const tickets = this.data.map(ticket => {\n return this.renderTicket(ticket);\n });\n return html`${tickets}`;\n }\n\n return html`<slot name=\"empty\"></slot>`;\n }\n}\n"]}
1
+ {"version":3,"file":"ContactTickets.js","sourceRoot":"","sources":["../../../src/contacts/ContactTickets.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { CustomEventType, Ticket, TicketStatus } from '../interfaces';\nimport { StoreElement } from '../store/StoreElement';\nimport { getClasses, postJSON, stopEvent } from '../utils';\nimport { Icon } from '../vectoricon';\n\nconst dropdownUserScale = 0.7;\nconst inlineUserScale = 0.8;\n\nexport class ContactTickets extends StoreElement {\n @property({ type: String })\n agent: string;\n\n @property({ type: String })\n contact: string;\n\n @property({ type: String })\n ticket: string;\n\n @property({ type: Boolean })\n clickable = false;\n\n @property({ type: Boolean })\n expandable = false;\n\n @property({ type: Boolean })\n expanded = false;\n\n @property({ type: Object, attribute: false })\n data: Ticket[];\n\n static get styles() {\n return css`\n :host {\n }\n\n :hover {\n }\n\n .ticket.expandable:hover,\n .ticket.clickable:hover {\n cursor: pointer;\n box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.055),\n 0 0 0px 2px var(--color-link-primary);\n }\n\n .header {\n display: flex;\n flex-direction: row;\n flex-grow: 1;\n }\n\n .tickets {\n display: flex;\n flex-direction: column;\n padding: 0.3em 0.8em;\n }\n\n .count {\n margin-left: 0.5em;\n }\n\n .ticket {\n background: #fff;\n display: flex;\n flex-direction: column;\n margin-bottom: 0.5em;\n border-radius: var(--curvature);\n display: flex;\n flex-direction: column;\n align-items: stretch;\n box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.055),\n 0 0 0px 1px rgba(0, 0, 0, 0.02);\n transition: all 200ms ease-in-out;\n }\n\n .ticket .topic {\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0.5em 0.75em 0.5em 0.75em;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n flex-grow: 2;\n }\n\n .ticket .body {\n max-height: 0px;\n overflow-y: auto;\n -webkit-line-clamp: none;\n white-space: normal;\n width: initial;\n padding: 0.5em 0.75em 0em 0.75em;\n max-height: 40vh;\n display: none;\n margin-bottom: 0.5em;\n border-top: 1px solid #e6e6e6;\n }\n\n .ticket.expanded .body {\n display: block;\n }\n\n .status {\n --icon-color: #999;\n }\n\n .ticket.closed {\n background: #f9f9f9;\n color: #888;\n }\n\n .resolve {\n color: var(--color-primary-dark);\n }\n\n .dropdown {\n color: rgb(45, 45, 45);\n z-index: 50;\n width: 18em;\n }\n\n .option-group {\n padding: 0.4em;\n border-bottom: 1px solid #f3f3f3;\n }\n\n .option-group temba-user {\n flex-grow: 1;\n }\n\n .assigned .user {\n flex-grow: 1;\n }\n\n .assigned {\n display: flex;\n align-items: center;\n }\n\n .assigned temba-button {\n margin-right: 0.75em;\n }\n\n .assigned .user:hover {\n cursor: default;\n background: none;\n }\n\n .options {\n max-height: 40vh;\n overflow-y: auto;\n border-bottom: none;\n }\n\n .user {\n display: flex;\n align-items: center;\n border-radius: var(--curvature);\n cursor: pointer;\n }\n\n .user:hover {\n background: var(--color-selection);\n }\n\n .user .name {\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n flex-grow: 1;\n }\n\n .user temba-button {\n margin-left: 0.5em;\n }\n\n .current-user {\n font-weight: 400;\n }\n\n .details {\n display: flex;\n align-items: center;\n flex-shrink: 1;\n margin-right: 0.5em;\n }\n\n .details .date {\n padding: 0em 0.5em;\n }\n\n .details .toggle {\n padding-right: 0.5em;\n }\n `;\n }\n\n prepareData(data: any): any {\n if (data && data.length) {\n data.sort((a: Ticket, b: Ticket) => {\n if (a.status == TicketStatus.Open && b.status == TicketStatus.Closed) {\n return -1;\n }\n\n if (b.status == TicketStatus.Open && a.status == TicketStatus.Closed) {\n return 1;\n }\n\n if (\n a.status == TicketStatus.Closed &&\n b.status == TicketStatus.Closed\n ) {\n return (\n new Date(b.closed_on).getTime() - new Date(a.closed_on).getTime()\n );\n }\n\n return (\n new Date(b.opened_on).getTime() - new Date(a.opened_on).getTime()\n );\n });\n }\n return data;\n }\n\n protected updated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changes);\n if (changes.has('contact') || changes.has('ticket')) {\n if (this.contact) {\n this.url = `/api/v2/tickets.json?contact=${this.contact}${\n this.ticket ? '&ticket=' + this.ticket : ''\n }`;\n } else {\n this.url = null;\n }\n }\n }\n\n private handleClose(uuid: string) {\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'close'\n })\n .then(() => {\n this.refresh();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n private handleReopen(uuid: string) {\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'reopen'\n })\n .then(() => {\n this.refresh();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n public handleTicketAssignment(uuid: string, email: string) {\n // if its already assigned to use, it's a noop\n const ticket = this.data.find((ticket) => ticket.uuid === uuid);\n if (ticket.assignee && ticket.assignee.email === email) {\n return;\n }\n this.blur();\n\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'assign',\n assignee: email\n })\n .then(() => {\n this.refresh();\n })\n .catch((response: any) => {\n console.error(response);\n });\n return true;\n }\n\n public renderTicket(ticket: Ticket) {\n const date = ticket.opened_on;\n const users = this.store.getAssignableUsers();\n const agent = users.find((user) => user.email === this.agent);\n return html`\n <div\n @click=${() => {\n if (this.clickable) {\n this.fireCustomEvent(CustomEventType.ButtonClicked, { ticket });\n } else if (this.expandable) {\n this.expanded = !this.expanded;\n }\n }}\n class=\"ticket ${ticket.status} ${getClasses({\n clickable: this.clickable,\n expandable: this.expandable,\n expanded: this.expanded\n })}\"\n >\n <div class=\"header\">\n <div class=\"topic\">${ticket.topic.name}</div>\n\n <div class=\"details\">\n <div class=\"date\">\n <temba-date value=\"${date}\" display=\"duration\"></temba-date>\n </div>\n\n ${ticket.status === TicketStatus.Closed\n ? html`<div class=\"reopen\">\n <temba-button\n primary\n small\n name=\"Reopen\"\n @click=${(event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.handleReopen(ticket.uuid);\n }}\n ></temba-button>\n </div>`\n : html`\n <div>\n <temba-dropdown\n right\n arrowsize=\"8\"\n arrowoffset=\"-44\"\n offsety=\"8\"\n offsetx=${ticket.assignee ? -42 : -28}\n >\n <div slot=\"toggle\" class=\"toggle\">\n ${ticket.assignee\n ? html`\n <temba-user\n email=${ticket.assignee.email}\n scale=\"${inlineUserScale}\"\n ></temba-user>\n `\n : html`\n <temba-button\n name=\"Assign\"\n primary\n small\n ></temba-button>\n `}\n </div>\n\n <div\n slot=\"dropdown\"\n class=\"dropdown\"\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n }}\n >\n ${ticket.assignee\n ? html`\n <div\n class=\"assigned option-group ${agent &&\n ticket.assignee.email == agent.email\n ? 'current-user'\n : ''}\"\n >\n <temba-user\n email=${ticket.assignee.email}\n name\n scale=\"${dropdownUserScale}\"\n ></temba-user>\n <temba-button\n name=\"Unassign\"\n primary\n small\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n this.handleTicketAssignment(\n ticket.uuid,\n null\n );\n }}\n ></temba-button>\n </div>\n `\n : null}\n ${agent &&\n (!ticket.assignee ||\n agent.email !== ticket.assignee.email)\n ? html`\n <div\n class=\"current-user option-group\"\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n this.handleTicketAssignment(\n ticket.uuid,\n agent.email\n );\n }}\n >\n <temba-user\n email=${agent.email}\n name\n scale=\"${dropdownUserScale}\"\n ></temba-user>\n </div>\n `\n : null}\n\n <div class=\"options option-group\">\n ${this.store.getAssignableUsers().map((user) => {\n if (\n ticket.assignee &&\n user.email === ticket.assignee.email\n ) {\n return null;\n }\n\n if (user.email === this.agent) {\n return null;\n }\n return html`<div\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n this.handleTicketAssignment(\n ticket.uuid,\n user.email\n );\n }}\n >\n <temba-user\n email=${user.email}\n scale=\"${dropdownUserScale}\"\n name\n ></temba-user>\n </div>`;\n })}\n </div>\n </div>\n </temba-dropdown>\n </div>\n <temba-tip\n text=\"Resolve\"\n position=\"left\"\n style=\"width:1.5em\"\n class=\"resolve\"\n >\n <temba-icon\n size=\"1.25\"\n name=\"${Icon.check}\"\n @click=${(event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.handleClose(ticket.uuid);\n }}\n ?clickable=${open}\n />\n </temba-tip>\n `}\n </div>\n </div>\n <div class=\"body\">${ticket.body}</div>\n </div>\n `;\n }\n\n public render(): TemplateResult {\n if (this.data && this.data.length > 0) {\n const tickets = this.data.map((ticket) => {\n return this.renderTicket(ticket);\n });\n return html`${tickets}`;\n }\n\n return html`<slot name=\"empty\"></slot>`;\n }\n}\n"]}
@@ -661,7 +661,7 @@ export const renderMsgEvent = (event) => {
661
661
  <div
662
662
  class="${event.msg.text ? '' : 'no-message'} attachments-${(event.msg.attachments || []).length} ${getClasses({
663
663
  msg: true,
664
- automated: !isInbound && !event.created_by,
664
+ automated: !isInbound && !event.created_by
665
665
  })}"
666
666
  >
667
667
  ${event.msg.text
@@ -669,7 +669,7 @@ export const renderMsgEvent = (event) => {
669
669
  : null}
670
670
  ${event.msg.attachments
671
671
  ? html `<div class="attachments">
672
- ${event.msg.attachments.map(attachment => html ` <div class="attachment">
672
+ ${event.msg.attachments.map((attachment) => html ` <div class="attachment">
673
673
  ${renderAttachment(attachment)}
674
674
  </div>`)}
675
675
  </div> `