@nyaruka/temba-components 0.64.1 → 0.65.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.
- package/CHANGELOG.md +11 -1
- package/dist/{43489c4a.js → a2d57560.js} +11 -4
- package/dist/index.js +11 -4
- package/dist/sw.js +1 -1
- package/dist/sw.js.map +1 -1
- package/dist/templates/components-body.html +1 -1
- package/dist/templates/components-head.html +1 -1
- package/out-tsc/src/contacts/ContactHistory.js +10 -6
- package/out-tsc/src/contacts/ContactHistory.js.map +1 -1
- package/out-tsc/src/contacts/events.js +14 -2
- package/out-tsc/src/contacts/events.js.map +1 -1
- package/package.json +1 -1
- package/src/contacts/ContactHistory.ts +14 -12
- package/src/contacts/events.ts +16 -3
package/CHANGELOG.md
CHANGED
|
@@ -4,8 +4,14 @@ All notable changes to this project will be documented in this file. Dates are d
|
|
|
4
4
|
|
|
5
5
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
6
6
|
|
|
7
|
+
#### [v0.65.0](https://github.com/nyaruka/temba-components/compare/v0.64.1...v0.65.0)
|
|
8
|
+
|
|
9
|
+
- Add queued treatment for messages, allow updating most recent message [`#385`](https://github.com/nyaruka/temba-components/pull/385)
|
|
10
|
+
|
|
7
11
|
#### [v0.64.1](https://github.com/nyaruka/temba-components/compare/v0.64.0...v0.64.1)
|
|
8
12
|
|
|
13
|
+
> 23 November 2023
|
|
14
|
+
|
|
9
15
|
- Improve extraction of initials for avatars [`#383`](https://github.com/nyaruka/temba-components/pull/383)
|
|
10
16
|
- Improve non-ascii support in extractInitials [`2f291cd`](https://github.com/nyaruka/temba-components/commit/2f291cd0400cce84ae7657c19578db680f451660)
|
|
11
17
|
|
|
@@ -104,12 +110,16 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
|
104
110
|
- Fix reading created_by for msg events [`#364`](https://github.com/nyaruka/temba-components/pull/364)
|
|
105
111
|
- Add logical icon names for optin and optout [`#365`](https://github.com/nyaruka/temba-components/pull/365)
|
|
106
112
|
|
|
107
|
-
#### [v0.58.8](https://github.com/nyaruka/temba-components/compare/v0.58.
|
|
113
|
+
#### [v0.58.8](https://github.com/nyaruka/temba-components/compare/v0.58.7...v0.58.8)
|
|
108
114
|
|
|
109
115
|
> 28 September 2023
|
|
110
116
|
|
|
111
117
|
- Update publish.yml [`7dc7d69`](https://github.com/nyaruka/temba-components/commit/7dc7d69822942b39c3b35e06846cfd4c65108b2d)
|
|
112
118
|
|
|
119
|
+
#### [v0.58.7](https://github.com/nyaruka/temba-components/compare/v0.58.6...v0.58.7)
|
|
120
|
+
|
|
121
|
+
> 28 September 2023
|
|
122
|
+
|
|
113
123
|
#### [v0.58.6](https://github.com/nyaruka/temba-components/compare/v0.58.5...v0.58.6)
|
|
114
124
|
|
|
115
125
|
> 28 September 2023
|
|
@@ -1819,11 +1819,14 @@ function t(t,e,i,n){var o,s=arguments.length,r=s<3?e:null===n?n=Object.getOwnPro
|
|
|
1819
1819
|
class="broadcast"
|
|
1820
1820
|
name="${pt.broadcast}"
|
|
1821
1821
|
></temba-icon>`),t.recipient_count>1&&s.push(D`<div class="recipients">${t.recipient_count} contacts</div>`),s.push(D`<div class="separator">•</div>`)),t.optin&&s.push(D`<div class="optin">${t.optin.name}</div>
|
|
1822
|
-
<div class="separator">•</div>`),s.push(D`<temba-date
|
|
1822
|
+
<div class="separator">•</div>`),"Q"===t.status&&s.push(D`<div>Queued</div>`),s.push(D`<temba-date
|
|
1823
1823
|
class="time"
|
|
1824
1824
|
value="${t.created_on}"
|
|
1825
1825
|
display="duration"
|
|
1826
|
-
></temba-date>`),D`<div
|
|
1826
|
+
></temba-date>`),D`<div
|
|
1827
|
+
style="display:flex;align-items:flex-start"
|
|
1828
|
+
class=${ee({queued:"Q"===t.status})}
|
|
1829
|
+
>
|
|
1827
1830
|
<div style="display:flex;flex-direction:column">
|
|
1828
1831
|
<div
|
|
1829
1832
|
class="${t.msg.text?"":"no-message"} attachments-${(t.msg.attachments||[]).length} ${ee({msg:!0,automated:!i&&!t.created_by})}"
|
|
@@ -1869,7 +1872,7 @@ function t(t,e,i,n){var o,s=arguments.length,r=s<3?e:null===n?n=Object.getOwnPro
|
|
|
1869
1872
|
|
|
1870
1873
|
<div
|
|
1871
1874
|
class="msg-summary"
|
|
1872
|
-
style="flex-direction:row${i?"-reverse":""}"
|
|
1875
|
+
style="align-items:center;flex-direction:row${i?"-reverse":""}"
|
|
1873
1876
|
>
|
|
1874
1877
|
<div style="flex-grow:1"></div>
|
|
1875
1878
|
${s}
|
|
@@ -2111,6 +2114,10 @@ function t(t,e,i,n){var o,s=arguments.length,r=s<3?e:null===n?n=Object.getOwnPro
|
|
|
2111
2114
|
background: var(--color-automated) !important;
|
|
2112
2115
|
}
|
|
2113
2116
|
|
|
2117
|
+
.queued {
|
|
2118
|
+
opacity: 0.3;
|
|
2119
|
+
}
|
|
2120
|
+
|
|
2114
2121
|
.optin_requested {
|
|
2115
2122
|
--icon-color: var(--color-primary-dark);
|
|
2116
2123
|
}
|
|
@@ -2458,7 +2465,7 @@ function t(t,e,i,n){var o,s=arguments.length,r=s<3?e:null===n?n=Object.getOwnPro
|
|
|
2458
2465
|
.attachment img {
|
|
2459
2466
|
cursor: pointer;
|
|
2460
2467
|
}
|
|
2461
|
-
`}firstUpdated(t){super.firstUpdated(t),this.handleClose=this.handleClose.bind(this)}updated(t){if(super.updated(t),t.has("mostRecentEvent")&&t.get("mostRecentEvent")&&this.mostRecentEvent&&this.fireCustomEvent(ke.Refreshed),t.has("endDate")&&this.refreshTimeout&&this.endDate&&window.clearTimeout(this.refreshTimeout),t.has("uuid"))if(null==this.uuid)this.reset();else{const t=`/contact/history/${this.uuid}/?_format=json`;if(this.endpoint!==t){if(this.reset(),this.endDate){const t=new Date(this.endDate);this.nextBefore=1e3*t.getTime()+1e3}this.endpoint=t,this.refreshTickets()}}if(t.has("ticket")&&(this.endpoint=null,this.requestUpdate("uuid")),t.has("refreshing")&&this.refreshing&&this.endpoint&&!this.endDate){const t=1e3*(this.getLastEventTime()-1);let e=!1;nl(!1,this.endpoint,this.ticket,null,t).then((t=>{t.events&&t.events.length>0&&this.updateMostRecent(t.events[0]),t.events.forEach((t=>{if(t.type===sl.TICKET_OPENED){const e=t;this.ticketEvents[e.ticket.uuid]=e}}));
|
|
2468
|
+
`}firstUpdated(t){super.firstUpdated(t),this.handleClose=this.handleClose.bind(this)}updated(t){if(super.updated(t),t.has("mostRecentEvent")&&t.get("mostRecentEvent")&&this.mostRecentEvent&&this.fireCustomEvent(ke.Refreshed),t.has("endDate")&&this.refreshTimeout&&this.endDate&&window.clearTimeout(this.refreshTimeout),t.has("uuid"))if(null==this.uuid)this.reset();else{const t=`/contact/history/${this.uuid}/?_format=json`;if(this.endpoint!==t){if(this.reset(),this.endDate){const t=new Date(this.endDate);this.nextBefore=1e3*t.getTime()+1e3}this.endpoint=t,this.refreshTickets()}}if(t.has("ticket")&&(this.endpoint=null,this.requestUpdate("uuid")),t.has("refreshing")&&this.refreshing&&this.endpoint&&!this.endDate){const t=1e3*(this.getLastEventTime()-1);let e=!1;nl(!1,this.endpoint,this.ticket,null,t).then((t=>{t.events&&t.events.length>0&&this.updateMostRecent(t.events[0]),t.events.forEach((t=>{if(t.type===sl.TICKET_OPENED){const e=t;this.ticketEvents[e.ticket.uuid]=e}}));const i=t.events.reverse();let n=0;this.eventGroups.forEach((t=>{const e=t.events.length;t.events=t.events.filter((t=>!i.find((e=>t.created_on==e.created_on&&t.type===e.type)))),n+=e-t.events.length})),this.lastRefreshAdded=i.length-n;const o=[...this.eventGroups];if(this.eventGroups.length>0){const t=o.splice(o.length-1,1)[0];e=t.open,i.splice(0,0,...t.events)}const s=this.getEventGroups(i);s.length&&(e&&(s[s.length-1].open=e),this.eventGroups=[...o,...s]),this.refreshing=!1,this.scheduleRefresh()})).catch((()=>{this.refreshing=!1,this.scheduleRefresh()}))}if(t.has("fetching")&&this.fetching&&(this.nextBefore||(this.nextBefore=1e3*(new Date).getTime()-1e3),this.httpComplete=nl(this.empty,this.endpoint,this.ticket,this.nextBefore,this.nextAfter).then((t=>{t.events&&t.events.length>0&&(this.updateMostRecent(t.events[0]),t.events.forEach((t=>{if(t.type===sl.TICKET_OPENED){const e=t;this.ticketEvents[e.ticket.uuid]=e}})));let e=!1;const i=t.events?t.events.reverse():[];if(this.eventGroups.length>0){const t=this.eventGroups.splice(0,1)[0];e=t.open,i.push(...t.events)}const n=this.getEventGroups(i);n.length&&(e&&(n[n.length-1].open=e),this.eventGroups=[...n,...this.eventGroups]),t.next_before===this.nextBefore&&(this.complete=!0),this.nextBefore=t.next_before,this.nextAfter=t.next_after,this.fetching=!1,this.empty=!1}))),t.has("refreshing")&&!this.refreshing&&this.lastRefreshAdded>0){const t=this.getEventsPane();if(this.lastHeight>0){const e=t.scrollHeight-this.lastHeight;t.scrollHeight-t.scrollTop-e-t.clientHeight<500?this.scrollToBottom():this.showMessageAlert=!0}this.eventGroups.length>0&&(this.lastHeight=t.scrollHeight)}if(t.has("fetching")&&!this.fetching&&void 0!==t.get("fetching")){const t=this.getEventsPane();if(this.lastHeight&&t.scrollHeight>this.lastHeight){const e=t.scrollTop+t.scrollHeight-this.lastHeight;t.scrollTop=e}this.lastHeight||this.scrollToBottom(),this.eventGroups.length>0&&(this.lastHeight=t.scrollHeight)}t.has("endpoint")&&this.endpoint&&(this.fetching=!0,this.empty=!0)}refreshTickets(){if(this.ticket){let t=`/api/v2/tickets.json?contact=${this.uuid}`;this.ticket&&(t=`${t}&ticket=${this.ticket}`),se(t).then((t=>{this.tickets=t.reverse()}))}}getEventsPane(){return this.getDiv(".events")}scrollToBottom(t=!1){const e=this.getEventsPane();e.scrollTo({top:e.scrollHeight,behavior:t?"smooth":"auto"}),this.showMessageAlert=!1,window.setTimeout((()=>{e.scrollTo({top:e.scrollHeight,behavior:t?"smooth":"auto"})}),0)}refresh(){this.scheduleRefresh(500)}getEventGroups(t){const e=[];let i;for(const n of t){const t=rl(n,this.ticket);i&&i.type===t?i.events.push(n):(i&&e.push(i),i={open:!1,events:[n],type:t})}return i&&i.events.length>0&&e.push(i),e}scheduleRefresh(t=-1){if(this.endDate)return;let e=t;if(-1===t){const t=this.getLastEventTime();e=Math.max(Math.min(((new Date).getTime()-t)/2,1e4),500)}t>-1&&this.refreshTimeout&&window.clearTimeout(this.refreshTimeout),this.refreshTimeout=window.setTimeout((()=>{this.refreshing?(this.scheduleRefresh(),this.refreshing=!1):this.refreshing=!0}),e)}reset(){this.endpoint=null,this.tickets=null,this.ticketEvents={},this.eventGroups=[],this.fetching=!1,this.complete=!1,this.nextBefore=null,this.nextAfter=null,this.lastHeight=0}handleEventGroupShow(t){const e=t.currentTarget,i=parseInt(e.getAttribute("data-group-index"));this.eventGroups[this.eventGroups.length-i-1].open=!0,this.requestUpdate("eventGroups")}handleEventGroupHide(t){t.preventDefault(),t.stopPropagation();const e=t.currentTarget,i=parseInt(e.getAttribute("data-group-index"));this.eventGroups[this.eventGroups.length-i-1].open=!1,this.requestUpdate("eventGroups")}handleScroll(){this.getEventsPane().scrollTop<=100&&this.eventGroups.length>0&&!this.fetching&&!this.complete&&(this.fetching=!0)}updateMostRecent(t){this.mostRecentEvent&&this.mostRecentEvent.type===t.type&&this.mostRecentEvent.created_on===t.created_on||(this.mostRecentEvent=t)}getLastEventTime(){const t=this.eventGroups[this.eventGroups.length-1];if(t){const e=t.events[t.events.length-1];return new Date(e.created_on).getTime()}return 0}renderEvent(t){switch(t.type){case sl.IVR_CREATED:case sl.MESSAGE_CREATED:case sl.MESSAGE_RECEIVED:case sl.BROADCAST_CREATED:return ll(t,this.agent);case sl.FLOW_ENTERED:case sl.FLOW_EXITED:return(t=>{let e="Interrupted",i=pt.flow_interrupted;return"I"!==t.status&&(t.type===sl.FLOW_ENTERED?(e="Started",i=pt.flow):(e="Completed",i=pt.flow)),D`
|
|
2462
2469
|
<temba-icon name="${i}"></temba-icon>
|
|
2463
2470
|
<div class="description">
|
|
2464
2471
|
${e}
|
package/dist/index.js
CHANGED
|
@@ -1819,11 +1819,14 @@ function t(t,e,i,n){var o,s=arguments.length,r=s<3?e:null===n?n=Object.getOwnPro
|
|
|
1819
1819
|
class="broadcast"
|
|
1820
1820
|
name="${pt.broadcast}"
|
|
1821
1821
|
></temba-icon>`),t.recipient_count>1&&s.push(D`<div class="recipients">${t.recipient_count} contacts</div>`),s.push(D`<div class="separator">•</div>`)),t.optin&&s.push(D`<div class="optin">${t.optin.name}</div>
|
|
1822
|
-
<div class="separator">•</div>`),s.push(D`<temba-date
|
|
1822
|
+
<div class="separator">•</div>`),"Q"===t.status&&s.push(D`<div>Queued</div>`),s.push(D`<temba-date
|
|
1823
1823
|
class="time"
|
|
1824
1824
|
value="${t.created_on}"
|
|
1825
1825
|
display="duration"
|
|
1826
|
-
></temba-date>`),D`<div
|
|
1826
|
+
></temba-date>`),D`<div
|
|
1827
|
+
style="display:flex;align-items:flex-start"
|
|
1828
|
+
class=${ee({queued:"Q"===t.status})}
|
|
1829
|
+
>
|
|
1827
1830
|
<div style="display:flex;flex-direction:column">
|
|
1828
1831
|
<div
|
|
1829
1832
|
class="${t.msg.text?"":"no-message"} attachments-${(t.msg.attachments||[]).length} ${ee({msg:!0,automated:!i&&!t.created_by})}"
|
|
@@ -1869,7 +1872,7 @@ function t(t,e,i,n){var o,s=arguments.length,r=s<3?e:null===n?n=Object.getOwnPro
|
|
|
1869
1872
|
|
|
1870
1873
|
<div
|
|
1871
1874
|
class="msg-summary"
|
|
1872
|
-
style="flex-direction:row${i?"-reverse":""}"
|
|
1875
|
+
style="align-items:center;flex-direction:row${i?"-reverse":""}"
|
|
1873
1876
|
>
|
|
1874
1877
|
<div style="flex-grow:1"></div>
|
|
1875
1878
|
${s}
|
|
@@ -2111,6 +2114,10 @@ function t(t,e,i,n){var o,s=arguments.length,r=s<3?e:null===n?n=Object.getOwnPro
|
|
|
2111
2114
|
background: var(--color-automated) !important;
|
|
2112
2115
|
}
|
|
2113
2116
|
|
|
2117
|
+
.queued {
|
|
2118
|
+
opacity: 0.3;
|
|
2119
|
+
}
|
|
2120
|
+
|
|
2114
2121
|
.optin_requested {
|
|
2115
2122
|
--icon-color: var(--color-primary-dark);
|
|
2116
2123
|
}
|
|
@@ -2458,7 +2465,7 @@ function t(t,e,i,n){var o,s=arguments.length,r=s<3?e:null===n?n=Object.getOwnPro
|
|
|
2458
2465
|
.attachment img {
|
|
2459
2466
|
cursor: pointer;
|
|
2460
2467
|
}
|
|
2461
|
-
`}firstUpdated(t){super.firstUpdated(t),this.handleClose=this.handleClose.bind(this)}updated(t){if(super.updated(t),t.has("mostRecentEvent")&&t.get("mostRecentEvent")&&this.mostRecentEvent&&this.fireCustomEvent(ke.Refreshed),t.has("endDate")&&this.refreshTimeout&&this.endDate&&window.clearTimeout(this.refreshTimeout),t.has("uuid"))if(null==this.uuid)this.reset();else{const t=`/contact/history/${this.uuid}/?_format=json`;if(this.endpoint!==t){if(this.reset(),this.endDate){const t=new Date(this.endDate);this.nextBefore=1e3*t.getTime()+1e3}this.endpoint=t,this.refreshTickets()}}if(t.has("ticket")&&(this.endpoint=null,this.requestUpdate("uuid")),t.has("refreshing")&&this.refreshing&&this.endpoint&&!this.endDate){const t=1e3*(this.getLastEventTime()-1);let e=!1;nl(!1,this.endpoint,this.ticket,null,t).then((t=>{t.events&&t.events.length>0&&this.updateMostRecent(t.events[0]),t.events.forEach((t=>{if(t.type===sl.TICKET_OPENED){const e=t;this.ticketEvents[e.ticket.uuid]=e}}));
|
|
2468
|
+
`}firstUpdated(t){super.firstUpdated(t),this.handleClose=this.handleClose.bind(this)}updated(t){if(super.updated(t),t.has("mostRecentEvent")&&t.get("mostRecentEvent")&&this.mostRecentEvent&&this.fireCustomEvent(ke.Refreshed),t.has("endDate")&&this.refreshTimeout&&this.endDate&&window.clearTimeout(this.refreshTimeout),t.has("uuid"))if(null==this.uuid)this.reset();else{const t=`/contact/history/${this.uuid}/?_format=json`;if(this.endpoint!==t){if(this.reset(),this.endDate){const t=new Date(this.endDate);this.nextBefore=1e3*t.getTime()+1e3}this.endpoint=t,this.refreshTickets()}}if(t.has("ticket")&&(this.endpoint=null,this.requestUpdate("uuid")),t.has("refreshing")&&this.refreshing&&this.endpoint&&!this.endDate){const t=1e3*(this.getLastEventTime()-1);let e=!1;nl(!1,this.endpoint,this.ticket,null,t).then((t=>{t.events&&t.events.length>0&&this.updateMostRecent(t.events[0]),t.events.forEach((t=>{if(t.type===sl.TICKET_OPENED){const e=t;this.ticketEvents[e.ticket.uuid]=e}}));const i=t.events.reverse();let n=0;this.eventGroups.forEach((t=>{const e=t.events.length;t.events=t.events.filter((t=>!i.find((e=>t.created_on==e.created_on&&t.type===e.type)))),n+=e-t.events.length})),this.lastRefreshAdded=i.length-n;const o=[...this.eventGroups];if(this.eventGroups.length>0){const t=o.splice(o.length-1,1)[0];e=t.open,i.splice(0,0,...t.events)}const s=this.getEventGroups(i);s.length&&(e&&(s[s.length-1].open=e),this.eventGroups=[...o,...s]),this.refreshing=!1,this.scheduleRefresh()})).catch((()=>{this.refreshing=!1,this.scheduleRefresh()}))}if(t.has("fetching")&&this.fetching&&(this.nextBefore||(this.nextBefore=1e3*(new Date).getTime()-1e3),this.httpComplete=nl(this.empty,this.endpoint,this.ticket,this.nextBefore,this.nextAfter).then((t=>{t.events&&t.events.length>0&&(this.updateMostRecent(t.events[0]),t.events.forEach((t=>{if(t.type===sl.TICKET_OPENED){const e=t;this.ticketEvents[e.ticket.uuid]=e}})));let e=!1;const i=t.events?t.events.reverse():[];if(this.eventGroups.length>0){const t=this.eventGroups.splice(0,1)[0];e=t.open,i.push(...t.events)}const n=this.getEventGroups(i);n.length&&(e&&(n[n.length-1].open=e),this.eventGroups=[...n,...this.eventGroups]),t.next_before===this.nextBefore&&(this.complete=!0),this.nextBefore=t.next_before,this.nextAfter=t.next_after,this.fetching=!1,this.empty=!1}))),t.has("refreshing")&&!this.refreshing&&this.lastRefreshAdded>0){const t=this.getEventsPane();if(this.lastHeight>0){const e=t.scrollHeight-this.lastHeight;t.scrollHeight-t.scrollTop-e-t.clientHeight<500?this.scrollToBottom():this.showMessageAlert=!0}this.eventGroups.length>0&&(this.lastHeight=t.scrollHeight)}if(t.has("fetching")&&!this.fetching&&void 0!==t.get("fetching")){const t=this.getEventsPane();if(this.lastHeight&&t.scrollHeight>this.lastHeight){const e=t.scrollTop+t.scrollHeight-this.lastHeight;t.scrollTop=e}this.lastHeight||this.scrollToBottom(),this.eventGroups.length>0&&(this.lastHeight=t.scrollHeight)}t.has("endpoint")&&this.endpoint&&(this.fetching=!0,this.empty=!0)}refreshTickets(){if(this.ticket){let t=`/api/v2/tickets.json?contact=${this.uuid}`;this.ticket&&(t=`${t}&ticket=${this.ticket}`),se(t).then((t=>{this.tickets=t.reverse()}))}}getEventsPane(){return this.getDiv(".events")}scrollToBottom(t=!1){const e=this.getEventsPane();e.scrollTo({top:e.scrollHeight,behavior:t?"smooth":"auto"}),this.showMessageAlert=!1,window.setTimeout((()=>{e.scrollTo({top:e.scrollHeight,behavior:t?"smooth":"auto"})}),0)}refresh(){this.scheduleRefresh(500)}getEventGroups(t){const e=[];let i;for(const n of t){const t=rl(n,this.ticket);i&&i.type===t?i.events.push(n):(i&&e.push(i),i={open:!1,events:[n],type:t})}return i&&i.events.length>0&&e.push(i),e}scheduleRefresh(t=-1){if(this.endDate)return;let e=t;if(-1===t){const t=this.getLastEventTime();e=Math.max(Math.min(((new Date).getTime()-t)/2,1e4),500)}t>-1&&this.refreshTimeout&&window.clearTimeout(this.refreshTimeout),this.refreshTimeout=window.setTimeout((()=>{this.refreshing?(this.scheduleRefresh(),this.refreshing=!1):this.refreshing=!0}),e)}reset(){this.endpoint=null,this.tickets=null,this.ticketEvents={},this.eventGroups=[],this.fetching=!1,this.complete=!1,this.nextBefore=null,this.nextAfter=null,this.lastHeight=0}handleEventGroupShow(t){const e=t.currentTarget,i=parseInt(e.getAttribute("data-group-index"));this.eventGroups[this.eventGroups.length-i-1].open=!0,this.requestUpdate("eventGroups")}handleEventGroupHide(t){t.preventDefault(),t.stopPropagation();const e=t.currentTarget,i=parseInt(e.getAttribute("data-group-index"));this.eventGroups[this.eventGroups.length-i-1].open=!1,this.requestUpdate("eventGroups")}handleScroll(){this.getEventsPane().scrollTop<=100&&this.eventGroups.length>0&&!this.fetching&&!this.complete&&(this.fetching=!0)}updateMostRecent(t){this.mostRecentEvent&&this.mostRecentEvent.type===t.type&&this.mostRecentEvent.created_on===t.created_on||(this.mostRecentEvent=t)}getLastEventTime(){const t=this.eventGroups[this.eventGroups.length-1];if(t){const e=t.events[t.events.length-1];return new Date(e.created_on).getTime()}return 0}renderEvent(t){switch(t.type){case sl.IVR_CREATED:case sl.MESSAGE_CREATED:case sl.MESSAGE_RECEIVED:case sl.BROADCAST_CREATED:return ll(t,this.agent);case sl.FLOW_ENTERED:case sl.FLOW_EXITED:return(t=>{let e="Interrupted",i=pt.flow_interrupted;return"I"!==t.status&&(t.type===sl.FLOW_ENTERED?(e="Started",i=pt.flow):(e="Completed",i=pt.flow)),D`
|
|
2462
2469
|
<temba-icon name="${i}"></temba-icon>
|
|
2463
2470
|
<div class="description">
|
|
2464
2471
|
${e}
|
package/dist/sw.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
if(!self.define){let e,t={};const o=(o,n)=>(o=new URL(o+".js",n).href,t[o]||new Promise((t=>{if("document"in self){const e=document.createElement("script");e.src=o,e.onload=t,document.head.appendChild(e)}else e=o,importScripts(o),t()})).then((()=>{let e=t[o];if(!e)throw new Error(`Module ${o} didn’t register its module`);return e})));self.define=(n,s)=>{const i=e||("document"in self?document.currentScript.src:"")||location.href;if(t[i])return;let r={};const
|
|
1
|
+
if(!self.define){let e,t={};const o=(o,n)=>(o=new URL(o+".js",n).href,t[o]||new Promise((t=>{if("document"in self){const e=document.createElement("script");e.src=o,e.onload=t,document.head.appendChild(e)}else e=o,importScripts(o),t()})).then((()=>{let e=t[o];if(!e)throw new Error(`Module ${o} didn’t register its module`);return e})));self.define=(n,s)=>{const i=e||("document"in self?document.currentScript.src:"")||location.href;if(t[i])return;let r={};const c=e=>o(e,i),l={module:{uri:i},exports:r,require:c};t[i]=Promise.all(n.map((e=>l[e]||c(e)))).then((e=>(s(...e),r)))}}define(["./workbox-919adfb7"],(function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"a2d57560.js",revision:"5b4eb6a409540a1f1bac5b9c660a5100"},{url:"templates/components-body.html",revision:"4b1cef794499e632bf188dad1553ce7d"},{url:"templates/components-head.html",revision:"9e3e175e5c40563c7fe000ccd15492f8"}],{}),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("/index.html"))),e.registerRoute("polyfills/*.js",new e.CacheFirst,"GET")}));
|
|
2
2
|
//# sourceMappingURL=sw.js.map
|
package/dist/sw.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sw.js","sources":["../../tmp/
|
|
1
|
+
{"version":3,"file":"sw.js","sources":["../../tmp/c9e7ade19c41fb4397dde3a90aa28624/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/workspaces/temba-components/node_modules/workbox-routing/registerRoute.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/workspaces/temba-components/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/workspaces/temba-components/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/workspaces/temba-components/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {NavigationRoute as workbox_routing_NavigationRoute} from '/workspaces/temba-components/node_modules/workbox-routing/NavigationRoute.mjs';\nimport {createHandlerBoundToURL as workbox_precaching_createHandlerBoundToURL} from '/workspaces/temba-components/node_modules/workbox-precaching/createHandlerBoundToURL.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"a2d57560.js\",\n \"revision\": \"5b4eb6a409540a1f1bac5b9c660a5100\"\n },\n {\n \"url\": \"templates/components-body.html\",\n \"revision\": \"4b1cef794499e632bf188dad1553ce7d\"\n },\n {\n \"url\": \"templates/components-head.html\",\n \"revision\": \"9e3e175e5c40563c7fe000ccd15492f8\"\n }\n], {});\n\nworkbox_routing_registerRoute(new workbox_routing_NavigationRoute(workbox_precaching_createHandlerBoundToURL(\"/index.html\")));\n\n\nworkbox_routing_registerRoute(\"polyfills/*.js\", new workbox_strategies_CacheFirst(), 'GET');\n\n\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","url","revision","workbox","registerRoute","workbox_routing_NavigationRoute","workbox_precaching_createHandlerBoundToURL","workbox_strategies_CacheFirst"],"mappings":"0nBAwBAA,KAAKC,cAELC,EAAAA,eAQAC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,cACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,qCAEb,CAAE,GAEwBC,EAAAC,cAAC,IAAIC,EAAAA,gBAAgCC,EAAAA,wBAA2C,iBAGhFH,EAAAC,cAAC,iBAAkB,IAAIG,aAAiC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<script type="module" src="{{STATIC_URL}}@nyaruka/temba-components/dist/
|
|
1
|
+
<script type="module" src="{{STATIC_URL}}@nyaruka/temba-components/dist/a2d57560.js"></script><script>window.TEMBA_COMPONENTS_VERSION="0.65.0"</script>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<link rel="modulepreload" href="{{STATIC_URL}}@nyaruka/temba-components/dist/
|
|
1
|
+
<link rel="modulepreload" href="{{STATIC_URL}}@nyaruka/temba-components/dist/a2d57560.js" crossorigin="anonymous">
|
|
@@ -189,15 +189,19 @@ export class ContactHistory extends RapidElement {
|
|
|
189
189
|
this.ticketEvents[ticketEvent.ticket.uuid] = ticketEvent;
|
|
190
190
|
}
|
|
191
191
|
});
|
|
192
|
-
|
|
192
|
+
const fetchedEvents = results.events.reverse();
|
|
193
193
|
// dedupe any events we get from the server
|
|
194
194
|
// TODO: perhaps make this a little less crazy
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
195
|
+
let removed = 0;
|
|
196
|
+
this.eventGroups.forEach(g => {
|
|
197
|
+
const before = g.events.length;
|
|
198
|
+
g.events = g.events.filter(prev => !fetchedEvents.find(fetched => {
|
|
199
|
+
return (prev.created_on == fetched.created_on &&
|
|
200
|
+
prev.type === fetched.type);
|
|
201
|
+
}));
|
|
202
|
+
removed += before - g.events.length;
|
|
199
203
|
});
|
|
200
|
-
this.lastRefreshAdded = fetchedEvents.length;
|
|
204
|
+
this.lastRefreshAdded = fetchedEvents.length - removed;
|
|
201
205
|
// reflow our most recent event group in case it merges with our new groups
|
|
202
206
|
const previousGroups = [...this.eventGroups];
|
|
203
207
|
if (this.eventGroups.length > 0) {
|
|
@@ -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, 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';\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\n public constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.shadowRoot.addEventListener('load', loadHandler, true);\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 let fetchedEvents = results.events.reverse();\n\n // dedupe any events we get from the server\n // TODO: perhaps make this a little less crazy\n fetchedEvents = fetchedEvents.filter(item => {\n const found = !!this.eventGroups.find(\n g =>\n !!g.events.find(\n exists =>\n exists.created_on === item.created_on &&\n exists.type === item.type\n )\n );\n\n return !found;\n });\n\n this.lastRefreshAdded = fetchedEvents.length;\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 return renderMsgEvent(event as MsgEvent, this.agent);\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 // render our older tickets as faux-events\n const unfetchedTickets =\n this.eventGroups.length > 0 && this.tickets\n ? this.tickets.map((ticket: Ticket) => {\n if (ticket && ticket.status === 'open') {\n const opened = new Date(ticket.opened_on).getTime() * 1000;\n if (opened < this.nextBefore || this.isPurged(ticket)) {\n const ticketOpenedEvent = {\n type: Events.TICKET_OPENED,\n ticket: {\n uuid: ticket.uuid,\n topic: ticket.topic,\n body: ticket.body,\n ticketer: ticket.ticketer,\n },\n created_on: ticket.opened_on,\n };\n\n const renderedEvent = renderTicketOpened(\n ticketOpenedEvent,\n this.handleClose,\n !this.ticket\n );\n return html`<div class=\"event ticket_opened\">\n ${renderedEvent}\n </div>`;\n }\n }\n })\n : null;\n\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 <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 </div>\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ContactHistory.js","sourceRoot":"","sources":["../../../src/contacts/ContactHistory.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAkB,MAAM,UAAU,CAAC;AAChD,OAAO,EAAW,eAAe,EAAU,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAS,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE5E,OAAO,EAWL,MAAM,EAEN,iBAAiB,EACjB,cAAc,EAKd,6BAA6B,EAC7B,sBAAsB,EACtB,wBAAwB,EACxB,kBAAkB,EAClB,wBAAwB,EACxB,iCAAiC,EACjC,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GAMnB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,WAAW,CAAC;AAGnB,qFAAqF;AACrF,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,KAAK;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IACzC,IAAI,MAAM,CAAC,OAAO,IAAI,KAAK,EAAE;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC/B,IACE,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI;gBAC1C,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,YAAY,GAAG,GAAG,EAC5C;gBACA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;aAC5B;SACF;KACF;AACH,CAAC,CAAC;AAEF,MAAM,OAAO,cAAe,SAAQ,YAAY;IAG9C;QACE,KAAK,EAAE,CAAC;QAiHV,gBAAW,GAAiB,EAAE,CAAC;QAG/B,eAAU,GAAG,KAAK,CAAC;QAGnB,aAAQ,GAAG,KAAK,CAAC;QAGjB,aAAQ,GAAG,KAAK,CAAC;QAMjB,UAAK,GAAG,KAAK,CAAC;QAGd,qBAAgB,GAAG,KAAK,CAAC;QAMzB,WAAM,GAAW,IAAI,CAAC;QAGtB,YAAO,GAAW,IAAI,CAAC;QAGvB,YAAO,GAAa,IAAI,CAAC;QAEzB,iBAAY,GAAoC,EAAE,CAAC;QAInD,eAAU,GAAG,CAAC,CAAC;QAEf,mBAAc,GAAQ,IAAI,CAAC;QAC3B,UAAK,GAAG,KAAK,CAAC;IAvJd,CAAC;IAED,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,oBAAoB;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC;IAEO,iBAAiB,CAAC,KAAkB;QAC1C,OAAO,IAAI,CAAC,SAAS,CAAE,KAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAEO,SAAS,CAAC,IAAY;QAC5B,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;QACN,cAAc,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA6EnB,CAAC;IACJ,CAAC;IAqDM,YAAY,CAAC,iBAAmC;QACrD,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAEM,OAAO,CAAC,iBAAmC;QAChD,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAEjC,sCAAsC;QACtC,IACE,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC;YACxC,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC;YACxC,IAAI,CAAC,eAAe,EACpB;YACA,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;SACjD;QAED,IAAI,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;YACpC,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE;gBACvC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;aAC1C;SACF;QAED,yCAAyC;QACzC,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YACjC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;gBACrB,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;iBAAM;gBACL,MAAM,QAAQ,GAAG,oBAAoB,IAAI,CAAC,IAAI,gBAAgB,CAAC;gBAE/D,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE;oBAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;oBAEb,IAAI,IAAI,CAAC,OAAO,EAAE;wBAChB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBACtC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;qBAClD;oBAED,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;oBACzB,IAAI,CAAC,cAAc,EAAE,CAAC;iBACvB;aACF;SACF;QAED,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YACnC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;SAC5B;QAED,IACE,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC;YACnC,IAAI,CAAC,UAAU;YACf,IAAI,CAAC,QAAQ;YACb,CAAC,IAAI,CAAC,OAAO,EACb;YACA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YACnD,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;iBAChE,IAAI,CAAC,CAAC,OAA2B,EAAE,EAAE;gBACpC,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC/C,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1C;gBAED,kCAAkC;gBAClC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAmB,EAAE,EAAE;oBAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,aAAa,EAAE;wBACvC,MAAM,WAAW,GAAG,KAAoB,CAAC;wBACzC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;qBAC1D;gBACH,CAAC,CAAC,CAAC;gBAEH,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAE/C,2CAA2C;gBAC3C,8CAA8C;gBAC9C,IAAI,OAAO,GAAG,CAAC,CAAC;gBAChB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;oBAC/B,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CACxB,IAAI,CAAC,EAAE,CACL,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;wBAC5B,OAAO,CACL,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU;4BACrC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAC3B,CAAC;oBACJ,CAAC,CAAC,CACL,CAAC;oBACF,OAAO,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBACtC,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC,MAAM,GAAG,OAAO,CAAC;gBAEvD,2EAA2E;gBAC3E,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;gBAE7C,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAClC,cAAc,CAAC,MAAM,GAAG,CAAC,EACzB,CAAC,CACF,CAAC,CAAC,CAAC,CAAC;oBAEL,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;oBACxB,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;iBAC9C;gBAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;gBACnD,IAAI,OAAO,CAAC,MAAM,EAAE;oBAClB,IAAI,SAAS,EAAE;wBACb,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC;qBAC9C;oBACD,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,OAAO,CAAC,CAAC;iBACpD;gBACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBACxB,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE;gBACV,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;gBACxB,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC,CAAC,CAAC;SACN;QAED,IAAI,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACtD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBACpB,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;aACtD;YAED,IAAI,CAAC,YAAY,GAAG,mBAAmB,CACrC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,SAAS,CACf,CAAC,IAAI,CAAC,CAAC,OAA2B,EAAE,EAAE;gBACrC,6BAA6B;gBAC7B,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC/C,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAEzC,kCAAkC;oBAClC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAmB,EAAE,EAAE;wBAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,aAAa,EAAE;4BACvC,MAAM,WAAW,GAAG,KAAoB,CAAC;4BACzC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;yBAC1D;oBACH,CAAC,CAAC,CAAC;iBACJ;gBAED,IAAI,SAAS,GAAG,KAAK,CAAC;gBACtB,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAErE,oEAAoE;gBACpE,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChD,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;oBACxB,aAAa,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;iBACtC;gBAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;gBACnD,IAAI,OAAO,CAAC,MAAM,EAAE;oBAClB,IAAI,SAAS,EAAE;wBACb,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS,CAAC;qBAC9C;oBAED,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;iBACtD;gBAED,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC,UAAU,EAAE;oBAC3C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;iBACtB;gBAED,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;gBACtC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;gBACpC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACrB,CAAC,CAAC,CAAC;SACJ;QAED,IAAI,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YAC3D,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE;gBAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBAEpC,qEAAqE;gBACrE,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE;oBACvB,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;oBAE1D,MAAM,kBAAkB,GACtB,MAAM,CAAC,YAAY;wBACnB,MAAM,CAAC,SAAS;wBAChB,WAAW;wBACX,MAAM,CAAC,YAAY,CAAC;oBAEtB,IAAI,kBAAkB,GAAG,GAAG,EAAE;wBAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;qBACvB;yBAAM;wBACL,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;qBAC9B;iBACF;gBAED,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC/B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;iBACvC;aACF;SACF;QAED,IACE,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC;YACjC,CAAC,IAAI,CAAC,QAAQ;YACd,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS,EAC/C;YACA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAEpC,IAAI,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE;gBAC5D,MAAM,SAAS,GACb,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;gBAC3D,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;aAC9B;YAED,+CAA+C;YAC/C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBACpB,IAAI,CAAC,cAAc,EAAE,CAAC;aACvB;YAED,uDAAuD;YACvD,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;aACvC;SACF;QAED,IAAI,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YACtD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;SACnB;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,GAAG,GAAG,gCAAgC,IAAI,CAAC,IAAI,EAAE,CAAC;YACtD,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,GAAG,GAAG,GAAG,GAAG,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;aACtC;YAED,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAiB,EAAE,EAAE;gBACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YACnC,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;IAEM,aAAa;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAEM,cAAc,CAAC,MAAM,GAAG,KAAK;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC;YACd,GAAG,EAAE,MAAM,CAAC,YAAY;YACxB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;SACrC,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAE9B,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACrB,MAAM,CAAC,QAAQ,CAAC;gBACd,GAAG,EAAE,MAAM,CAAC,YAAY;gBACxB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;aACrC,CAAC,CAAC;QACL,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAEO,cAAc,CAAC,MAAsB;QAC3C,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,IAAI,UAAU,GAAe,SAAS,CAAC;QACvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACpE,mCAAmC;YACnC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,qBAAqB,EAAE;gBAC5D,0CAA0C;gBAC1C,IAAI,UAAU,EAAE;oBACd,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;iBAC1B;gBACD,UAAU,GAAG;oBACX,IAAI,EAAE,KAAK;oBACX,MAAM,EAAE,CAAC,KAAK,CAAC;oBACf,IAAI,EAAE,qBAAqB;iBAC5B,CAAC;aACH;iBAAM;gBACL,yDAAyD;gBACzD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC/B;SACF;QAED,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAC1B;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,OAAO;SACR;QAED,IAAI,WAAW,GAAG,IAAI,CAAC;QAEvB,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE;YACf,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9C,WAAW,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC,EACtE,gBAAgB,CACjB,CAAC;SACH;QAED,iCAAiC;QACjC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE;YACpC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SAC1C;QAED,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YAC3C,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;aACzB;iBAAM;gBACL,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;aACxB;QACH,CAAC,EAAE,WAAW,CAAC,CAAC;IAClB,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IACtB,CAAC;IAEO,oBAAoB,CAAC,KAAiB;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,aAA+B,CAAC;QACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACvE,MAAM,UAAU,GACd,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC;QAC7D,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IACpC,CAAC;IAEO,oBAAoB,CAAC,KAAiB;QAC5C,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,MAAM,QAAQ,GAAG,KAAK,CAAC,aAA+B,CAAC;QACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACvE,MAAM,UAAU,GACd,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC;QAE7D,UAAU,CAAC,IAAI,GAAG,KAAK,CAAC;QAExB,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IACpC,CAAC;IAEO,YAAY;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,SAAS,IAAI,gBAAgB,EAAE;YACxC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBACnE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;aACtB;SACF;IACH,CAAC;IAEO,gBAAgB,CAAC,QAAsB;QAC7C,IACE,CAAC,IAAI,CAAC,eAAe;YACrB,IAAI,CAAC,eAAe,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;YAC3C,IAAI,CAAC,eAAe,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,EACvD;YACA,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;SACjC;IACH,CAAC;IAEO,gBAAgB;QACtB,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtE,IAAI,eAAe,EAAE;YACnB,MAAM,eAAe,GACnB,eAAe,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC5D,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC;SACvD;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAEM,WAAW,CAAC,KAAmB;QACpC,QAAQ,KAAK,CAAC,IAAI,EAAE;YAClB,KAAK,MAAM,CAAC,WAAW,CAAC;YACxB,KAAK,MAAM,CAAC,eAAe,CAAC;YAC5B,KAAK,MAAM,CAAC,gBAAgB,CAAC;YAC7B,KAAK,MAAM,CAAC,iBAAiB;gBAC3B,OAAO,cAAc,CAAC,KAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAEvD,KAAK,MAAM,CAAC,YAAY,CAAC;YACzB,KAAK,MAAM,CAAC,WAAW;gBACrB,OAAO,eAAe,CAAC,KAAkB,CAAC,CAAC;YAE7C,KAAK,MAAM,CAAC,kBAAkB;gBAC5B,OAAO,iBAAiB,CAAC,KAA0B,CAAC,CAAC;YAEvD,KAAK,MAAM,CAAC,qBAAqB;gBAC/B,OAAO,iBAAiB,CAAC,KAAyB,CAAC,CAAC;YAEtD,KAAK,MAAM,CAAC,oBAAoB;gBAC9B,OAAO,iBAAiB,CAAC,KAAyB,CAAC,CAAC;YAEtD,KAAK,MAAM,CAAC,oBAAoB;gBAC9B,OAAO,wBAAwB,CAAC,KAAyB,CAAC,CAAC;YAE7D,KAAK,MAAM,CAAC,UAAU;gBACpB,OAAO,eAAe,CAAC,KAAuB,CAAC,CAAC;YAElD,KAAK,MAAM,CAAC,kBAAkB;gBAC5B,OAAO,iBAAiB,CAAC,KAAyB,CAAC,CAAC;YAEtD,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC;gBACzB,OAAO,kBAAkB,CAAC,KAAoB,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACzE;YACD,KAAK,MAAM,CAAC,iBAAiB;gBAC3B,OAAO,iBAAiB,CAAC,KAAoB,CAAC,CAAC;YAEjD,KAAK,MAAM,CAAC,eAAe;gBACzB,OAAO,oBAAoB,CAAC,KAAoB,CAAC,CAAC;YACpD,KAAK,MAAM,CAAC,eAAe,CAAC,CAAC;gBAC3B,OAAO,kBAAkB,CACvB,KAAoB,EACpB,UAAU,EACV,CAAC,IAAI,CAAC,MAAM,CACb,CAAC;aACH;YACD,KAAK,MAAM,CAAC,aAAa;gBACvB,OAAO,kBAAkB,CAAC,KAAoB,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE1E,KAAK,MAAM,CAAC,KAAK,CAAC;YAClB,KAAK,MAAM,CAAC,OAAO;gBACjB,OAAO,kBAAkB,CAAC,KAA0B,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,sBAAsB;gBAChC,OAAO,wBAAwB,CAAC,KAA2B,CAAC,CAAC;YAC/D,KAAK,MAAM,CAAC,cAAc;gBACxB,OAAO,kBAAkB,CAAC,KAAqB,CAAC,CAAC;YACnD,KAAK,MAAM,CAAC,mBAAmB;gBAC7B,OAAO,6BAA6B,CAAC,KAAgC,CAAC,CAAC;YACzE,KAAK,MAAM,CAAC,YAAY;gBACtB,OAAO,sBAAsB,EAAE,CAAC;YAClC,KAAK,MAAM,CAAC,cAAc;gBACxB,OAAO,wBAAwB,CAAC,KAA2B,CAAC,CAAC;YAC/D,KAAK,MAAM,CAAC,aAAa;gBACvB,OAAO,kBAAkB,CAAC,KAAqB,CAAC,CAAC;YACnD,KAAK,MAAM,CAAC,wBAAwB;gBAClC,OAAO,iCAAiC,CACtC,KAAoC,CACrC,CAAC;YACJ,KAAK,MAAM,CAAC,eAAe;gBACzB,OAAO,oBAAoB,CAAC,KAA4B,CAAC,CAAC;SAC7D;QAED,OAAO,IAAI,CAAA;;;;iCAIkB,KAAK,CAAC,IAAI,QAAQ,CAAC;IAClD,CAAC;IAEO,WAAW,CAAC,IAAY;QAC9B,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,6BAA6B,EAAE;YAC1D,OAAO,EAAE,CAAC,IAAI,CAAC;YACf,MAAM,EAAE,OAAO;SAChB,CAAC;aACC,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,EAAE;gBACnD,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE;aACnC,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,QAAa,EAAE,EAAE;YACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,4BAA4B,CAAC,KAAa;QAC/C,IAAI,CAAC,YAAY,GAAG,SAAS,CAC3B,6BAA6B,IAAI,CAAC,MAAM,EAAE,CAC3C,CAAC,IAAI,CAAC,CAAC,MAAe,EAAE,EAAE;YACzB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAW,CAAC;gBACnC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE;oBACtD,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,EAAE;wBACnD,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;qBAChD,CAAC,CAAC;iBACJ;qBAAM;oBACL,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,EAAE;wBACnD,MAAM,EAAE;4BACN,IAAI,EAAE,IAAI,CAAC,MAAM;4BACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;yBACnD;qBACF,CAAC,CAAC;iBACJ;aACF;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,gBAAgB;QACrB,OAAO;YACL;gBACE,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;aACxC;SACF,CAAC;IACJ,CAAC;IAED,oEAAoE;IAC5D,QAAQ,CAAC,MAAc;QAC7B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEO,kBAAkB,CAAC,KAAK;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,MAAwB,CAAC;QAC3C,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,EAAE;YACxB,uCAAuC;YACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAa,CAAC;YACtE,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;aAC3B;SACF;IACH,CAAC;IAEO,oBAAoB,CAAC,KAAmB;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAA;;iBAEb,IAAI,CAAC,kBAAkB;iBACvB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,UAAU,KAAK,CAAC,IAAI;;UAE7D,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;QAEzB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;KACzE,CAAC;QACF,OAAO,aAAa,CAAC;IACvB,CAAC;IAEM,MAAM;QACX,0CAA0C;QAC1C,MAAM,gBAAgB,GACpB,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO;YACzC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAc,EAAE,EAAE;gBAClC,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE;oBACtC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;oBAC3D,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;wBACrD,MAAM,iBAAiB,GAAG;4BACxB,IAAI,EAAE,MAAM,CAAC,aAAa;4BAC1B,MAAM,EAAE;gCACN,IAAI,EAAE,MAAM,CAAC,IAAI;gCACjB,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,IAAI,EAAE,MAAM,CAAC,IAAI;gCACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;6BAC1B;4BACD,UAAU,EAAE,MAAM,CAAC,SAAS;yBAC7B,CAAC;wBAEF,MAAM,aAAa,GAAG,kBAAkB,CACtC,iBAAiB,EACjB,IAAI,CAAC,WAAW,EAChB,CAAC,IAAI,CAAC,MAAM,CACb,CAAC;wBACF,OAAO,IAAI,CAAA;oBACP,aAAa;uBACV,CAAC;qBACT;iBACF;YACH,CAAC,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC;QAEX,OAAO,IAAI,CAAA;QAEP,IAAI,CAAC,QAAQ;YACX,CAAC,CAAC,IAAI,CAAA,qDAAqD;YAC3D,CAAC,CAAC,IAAI,CAAA,gCACV;oCAC8B,IAAI,CAAC,YAAY;UAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAsB,EAAE,KAAa,EAAE,EAAE;YAC/D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACtE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;YAEvD,MAAM,OAAO,GAAG,UAAU,CAAC;gBACzB,QAAQ,EAAE,IAAI;gBACd,CAAC,QAAQ,CAAC,EAAE,IAAI;gBAChB,QAAQ,EAAE,UAAU,CAAC,IAAI;aAC1B,CAAC,CAAC;YACH,OAAO,IAAI,CAAA,eAAe,OAAO;cAC7B,QAAQ,KAAK,SAAS;gBACtB,CAAC,CAAC,IAAI,CAAA;;2BAEO,IAAI,CAAC,oBAAoB;sCACd,UAAU;;oBAE5B,UAAU,CAAC,IAAI;oBACf,CAAC,CAAC,IAAI,CAAA;iCACO,IAAI,CAAC,oBAAoB;4CACd,UAAU;;;qCAGjB;oBACjB,CAAC,CAAC,IAAI,CAAA,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM;wBAC7B,UAAU,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;wBAC9B,CAAC,CAAC,IAAI,CAAA,OAAO;wBACb,CAAC,CAAC,IAAI,CAAA,QAAQ,GAAG;uBAClB;gBACT,CAAC,CAAC,IAAI;;;gBAGJ,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAmB,EAAE,EAAE;gBAC9C,IACE,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,eAAe;oBACpC,KAAqB,CAAC,IAAI,EAC3B;oBACA,MAAM,SAAS,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;oBAC/B,SAAS,CAAC,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;oBAE1C,OAAO,IAAI,CAAA,GAAG,IAAI,CAAC,oBAAoB,CACrC,SAAS,CACV,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;iBACxC;qBAAM;oBACL,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;iBACzC;YACH,CAAC,CAAC;;iBAEC,CAAC;QACV,CAAC,CAAC;;;;;mBAKS,GAAG,EAAE;YACZ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;gCACqB,UAAU,CAAC;YAC/B,QAAQ,EAAE,IAAI,CAAC,gBAAgB;SAChC,CAAC;;;;;;KAMP,CAAC;IACJ,CAAC;CACF;AA/rBC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;+CACV;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;4CACd;AAGb;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CACb;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;mDACK;AAG/B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;kDACT;AAGnB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gDACX;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gDACX;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDACV;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;6CACd;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;wDACH;AAGzB;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uDACf;AAG9B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CACL;AAGtB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;+CACJ;AAGvB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;+CACD","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 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';\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\n public constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.shadowRoot.addEventListener('load', loadHandler, true);\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 return renderMsgEvent(event as MsgEvent, this.agent);\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 // render our older tickets as faux-events\n const unfetchedTickets =\n this.eventGroups.length > 0 && this.tickets\n ? this.tickets.map((ticket: Ticket) => {\n if (ticket && ticket.status === 'open') {\n const opened = new Date(ticket.opened_on).getTime() * 1000;\n if (opened < this.nextBefore || this.isPurged(ticket)) {\n const ticketOpenedEvent = {\n type: Events.TICKET_OPENED,\n ticket: {\n uuid: ticket.uuid,\n topic: ticket.topic,\n body: ticket.body,\n ticketer: ticket.ticketer,\n },\n created_on: ticket.opened_on,\n };\n\n const renderedEvent = renderTicketOpened(\n ticketOpenedEvent,\n this.handleClose,\n !this.ticket\n );\n return html`<div class=\"event ticket_opened\">\n ${renderedEvent}\n </div>`;\n }\n }\n })\n : null;\n\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 <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 </div>\n `;\n }\n}\n"]}
|
|
@@ -203,6 +203,10 @@ export const getEventStyles = () => {
|
|
|
203
203
|
background: var(--color-automated) !important;
|
|
204
204
|
}
|
|
205
205
|
|
|
206
|
+
.queued {
|
|
207
|
+
opacity: 0.3;
|
|
208
|
+
}
|
|
209
|
+
|
|
206
210
|
.optin_requested {
|
|
207
211
|
--icon-color: var(--color-primary-dark);
|
|
208
212
|
}
|
|
@@ -647,12 +651,18 @@ export const renderMsgEvent = (event, agent) => {
|
|
|
647
651
|
summary.push(html `<div class="optin">${event.optin.name}</div>
|
|
648
652
|
<div class="separator">•</div>`);
|
|
649
653
|
}
|
|
654
|
+
if (event.status === 'Q') {
|
|
655
|
+
summary.push(html `<div>Queued</div>`);
|
|
656
|
+
}
|
|
650
657
|
summary.push(html `<temba-date
|
|
651
658
|
class="time"
|
|
652
659
|
value="${event.created_on}"
|
|
653
660
|
display="duration"
|
|
654
661
|
></temba-date>`);
|
|
655
|
-
return html `<div
|
|
662
|
+
return html `<div
|
|
663
|
+
style="display:flex;align-items:flex-start"
|
|
664
|
+
class=${getClasses({ queued: event.status === 'Q' })}
|
|
665
|
+
>
|
|
656
666
|
<div style="display:flex;flex-direction:column">
|
|
657
667
|
<div
|
|
658
668
|
class="${event.msg.text ? '' : 'no-message'} attachments-${(event.msg.attachments || []).length} ${getClasses({
|
|
@@ -678,7 +688,9 @@ export const renderMsgEvent = (event, agent) => {
|
|
|
678
688
|
|
|
679
689
|
<div
|
|
680
690
|
class="msg-summary"
|
|
681
|
-
style="flex-direction:row${isInbound
|
|
691
|
+
style="align-items:center;flex-direction:row${isInbound
|
|
692
|
+
? '-reverse'
|
|
693
|
+
: ''}"
|
|
682
694
|
>
|
|
683
695
|
<div style="flex-grow:1"></div>
|
|
684
696
|
${summary}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/contacts/events.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { Msg, ObjectReference, User } from '../interfaces';\nimport {\n getClasses,\n NamedObject,\n oxford,\n oxfordFn,\n oxfordNamed,\n renderAvatar,\n} from '../utils';\nimport { Icon } from '../vectoricon';\nimport { getDisplayName } from './helpers';\n\nexport const getEventStyles = () => {\n return css`\n .grouping {\n margin-top: 1em;\n }\n\n .grouping.verbose {\n background: #f9f9f9;\n color: var(--color-dark);\n --color-link-primary: rgba(38, 166, 230, 1);\n pointer-events: none;\n background: #fefefe;\n box-shadow: -8px 0px 8px 1px rgba(0, 0, 0, 0.05) inset;\n margin-right: -16px;\n padding-right: 16px;\n margin-bottom: 1.3em;\n max-width: 100%;\n }\n\n .grouping .items {\n display: block;\n }\n\n .grouping.verbose .items {\n opacity: 0;\n max-height: 0;\n display: flex;\n flex-direction: column;\n user-select: none;\n }\n\n .grouping.flows .items {\n padding: 0;\n }\n\n .grouping.messages .items {\n display: flex;\n flex-direction: column;\n margin: 0em 0.75em;\n }\n\n .grouping.verbose.expanded .items {\n transition: max-height var(--transition-speed) ease-in-out,\n opacity var(--transition-speed) ease-in-out;\n opacity: 1;\n max-height: 1000px;\n padding: 1em 1em;\n }\n\n .grouping.verbose.expanded {\n border-top: 1px solid #f3f3f3;\n border-bottom: 1px solid #f3f3f3;\n }\n\n .grouping.verbose.expanded,\n .grouping.verbose .event-count {\n pointer-events: auto;\n }\n\n .grouping.verbose temba-icon {\n }\n\n .grouping.verbose > .event,\n .grouping.verbose > pre {\n max-height: 0px;\n padding-top: 0;\n padding-bottom: 0;\n margin-top: 0;\n margin-bottom: 0;\n opacity: 0;\n }\n\n .grouping.verbose .attn {\n color: #666;\n }\n\n .event-count {\n position: relative;\n font-size: 0.8em;\n text-align: center;\n margin: 0 auto;\n display: table;\n padding: 3px 10px;\n font-weight: 400;\n color: #999;\n cursor: pointer;\n width: 100%;\n opacity: 1;\n z-index: 1;\n }\n\n .event-count temba-icon {\n display: inline-block;\n position: absolute;\n right: 5px;\n top: 5px;\n }\n\n .event-count:hover {\n color: var(--color-link-primary-hover);\n }\n\n .expanded .event-count {\n padding: 0;\n pointer-events: none;\n }\n\n .grouping.flows {\n margin-left: 1em;\n margin-right: 1em;\n margin-bottom: 1.5em;\n\n border: 1px solid #f2f2f2;\n border-radius: var(--curvature);\n padding: 0.5em 1em;\n }\n\n .grouping.flows .event {\n margin: 0;\n padding: 0;\n }\n\n .grouping.tickets {\n margin-bottom: 2em;\n }\n\n pre {\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n\n .grouping.verbose.expanded .event,\n .grouping.verbose.expanded pre {\n max-height: 500px;\n opacity: 1;\n }\n\n .grouping-close-button {\n position: relative;\n display: inline-block;\n opacity: 0;\n float: right;\n --icon-color: #666;\n }\n\n .grouping.verbose.expanded:hover .grouping-close-button {\n opacity: 1;\n }\n\n .grouping.messages,\n .grouping.tickets {\n display: flex;\n flex-direction: column;\n }\n\n .event {\n margin: 0.25em 0.5em;\n border-radius: var(--curvature);\n flex-grow: 1;\n }\n\n .msg {\n border-radius: calc(var(--curvature) * 2.5);\n border: 2px solid rgba(100, 100, 100, 0.1);\n max-width: 300px;\n word-break: break-word;\n overflow: hidden;\n }\n\n .msg.attachments-1.no-message {\n border: 2px solid transparent;\n background-color: transparent !important;\n }\n\n .msg .text {\n padding: var(--event-padding);\n }\n\n .event.msg_received .msg {\n background: rgba(200, 200, 200, 0.1);\n }\n\n .event.msg_created,\n .event.broadcast_created,\n .event.ivr_created,\n .event.ticket_note_added {\n align-self: flex-end;\n }\n\n .event.msg_created .msg,\n .event.broadcast_created .msg,\n .event.ivr_created .msg {\n background: var(--color-primary-dark);\n color: white;\n font-weight: 400;\n }\n\n .msg.automated {\n background: var(--color-automated) !important;\n }\n\n .optin_requested {\n --icon-color: var(--color-primary-dark);\n }\n\n .webhook_called {\n --icon-color: #e68628;\n word-break: break-all;\n }\n\n .webhook_called .failed {\n --icon-color: var(--color-error);\n color: var(--color-error);\n }\n\n .input_labels_added,\n .contact_name_changed,\n .contact_field_changed,\n .contact_urns_changed,\n .contact_language_changed,\n .run_result_changed {\n --icon-color: rgba(1, 193, 175, 1);\n }\n\n .email_sent {\n --icon-color: #8e5ea7;\n }\n\n .contact_groups_changed .added {\n --icon-color: #309c42;\n }\n .contact_groups_changed .removed {\n --icon-color: var(--color-error);\n }\n\n .event.error .description,\n .event.failure .description {\n color: var(--color-error);\n }\n\n .description.error {\n color: var(--color-error);\n }\n\n .info {\n border: 1px solid rgba(100, 100, 100, 0.2);\n background: rgba(10, 10, 10, 0.02);\n }\n\n .ticket_note_added {\n max-width: 300px;\n }\n\n .note-summary {\n display: flex;\n flex-direction: row;\n font-size: 85%;\n margin-top: -0.5em;\n color: rgba(0, 0, 0, 0.6);\n padding: 8px 3px;\n }\n\n .ticket_note_added .description {\n border: 2px solid rgba(100, 100, 100, 0.1);\n background: rgb(255, 249, 194);\n padding: var(--event-padding);\n font-weight: 400;\n color: rgba(0, 0, 0, 0.6);\n border-radius: calc(var(--curvature) * 2.5);\n }\n\n .channel_event {\n --icon-color: rgb(200, 200, 200);\n }\n\n .airtime_transferred,\n .flow_exited,\n .flow_entered,\n .ticket_opened,\n .ticket_reopened,\n .ticket_closed,\n .call_started,\n .campaign_fired {\n --icon-color: rgba(223, 65, 159, 1);\n }\n\n .active-ticket.ticket_opened {\n padding: 0em 1em;\n }\n\n .ticket_closed .inactive .subtext {\n display: none;\n }\n\n .attn {\n color: var(--color-text);\n }\n\n .flow_exited,\n .flow_entered {\n align-self: center;\n max-width: 80%;\n display: flex;\n flex-direction: row;\n }\n\n .flow_exited temba-icon,\n .flow_entered temba-icon {\n }\n\n .event {\n display: flex;\n align-items: center;\n }\n\n .event .description {\n flex-grow: 1;\n }\n\n .msg-summary {\n display: flex;\n font-size: 85%;\n color: rgba(0, 0, 0, 0.6);\n padding: 6px 3px;\n margin-bottom: 0.5em;\n margin-top: -0.5em;\n }\n\n .msg-summary temba-icon.log {\n --icon-color: rgba(0, 0, 0, 0.2);\n }\n\n .msg-summary temba-icon.log:hover {\n --icon-color: var(--color-link-primary-hover);\n cursor: pointer;\n }\n\n .msg-summary temba-icon.error {\n --icon-color: rgba(var(--error-rgb), 0.75);\n }\n\n .msg-summary temba-icon.error:hover {\n --icon-color: var(--color-error);\n cursor: pointer;\n }\n\n .msg-summary temba-icon.broadcast {\n --icon-color: rgba(90, 90, 90, 0.5);\n }\n\n .msg-summary * {\n display: flex;\n margin-right: 1px;\n margin-left: 1px;\n }\n\n .unsupported {\n border: 1px solid #f2f2f2;\n color: #999;\n padding: 0.5em 1em;\n border-radius: var(--curvature);\n }\n\n .optin {\n align-items: center;\n padding: 0 0.2em;\n }\n\n .time {\n padding: 0.3em 1px;\n }\n\n .subtext .time {\n padding: 0em;\n }\n\n .status {\n padding: 0.3em 3px;\n }\n\n .separator {\n padding: 0.3em 0px;\n }\n\n .recipients {\n padding: 0.3em 3px;\n }\n\n .verbose temba-icon,\n .flows temba-icon,\n .tickets temba-icon {\n margin-right: 0.75em;\n }\n\n .attn {\n display: inline-block;\n font-weight: 500;\n margin: 0px 2px;\n word-break: break-all;\n white-space: break-spaces;\n }\n\n .subtext {\n font-size: 80%;\n }\n\n .body-pre {\n white-space: pre-wrap;\n word-wrap: break-word;\n font-size: 90%;\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 temba-icon.error {\n --icon-color: var(--color-error);\n }\n\n .delivery-error {\n --icon-color: var(--color-error);\n margin-right: 0.25em;\n }\n\n .flow {\n --icon-color: #ddd;\n background: #fff;\n width: 18px;\n height: 18px;\n padding-top: 4px;\n padding-left: 9px;\n border: 0px solid #f3f3f3;\n }\n\n .assigned {\n color: #777;\n max-width: 300px;\n margin-left: auto;\n margin-right: auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-bottom: 10px;\n }\n\n .assigned .attn {\n color: #777;\n }\n\n .attachments {\n display: flex;\n flex-wrap: wrap;\n margin: -0.2em;\n }\n\n .attachment {\n flex: 1 0 45%;\n border-top: 0.05em solid transparent;\n border-left: 0.05em solid transparent;\n margin-top: 0.05em;\n margin-left: 0.05em;\n }\n `;\n};\n\nexport interface EventGroup {\n type: string;\n events: ContactEvent[];\n open: boolean;\n}\n\nexport enum Events {\n MESSAGE_CREATED = 'msg_created',\n MESSAGE_RECEIVED = 'msg_received',\n BROADCAST_CREATED = 'broadcast_created',\n IVR_CREATED = 'ivr_created',\n FLOW_ENTERED = 'flow_entered',\n FLOW_EXITED = 'flow_exited',\n RUN_RESULT_CHANGED = 'run_result_changed',\n CONTACT_FIELD_CHANGED = 'contact_field_changed',\n CONTACT_GROUPS_CHANGED = 'contact_groups_changed',\n CONTACT_NAME_CHANGED = 'contact_name_changed',\n CONTACT_URNS_CHANGED = 'contact_urns_changed',\n CAMPAIGN_FIRED = 'campaign_fired',\n CHANNEL_EVENT = 'channel_event',\n CONTACT_LANGUAGE_CHANGED = 'contact_language_changed',\n WEBHOOK_CALLED = 'webhook_called',\n AIRTIME_TRANSFERRED = 'airtime_transferred',\n CALL_STARTED = 'call_started',\n EMAIL_SENT = 'email_sent',\n INPUT_LABELS_ADDED = 'input_labels_added',\n NOTE_CREATED = 'note_created',\n TICKET_ASSIGNED = 'ticket_assigned',\n TICKET_NOTE_ADDED = 'ticket_note_added',\n TICKET_CLOSED = 'ticket_closed',\n TICKET_OPENED = 'ticket_opened',\n TICKET_REOPENED = 'ticket_reopened',\n OPTIN_REQUESTED = 'optin_requested',\n ERROR = 'error',\n FAILURE = 'failure',\n}\n\nexport interface ContactEvent {\n type: string;\n created_on: string;\n}\n\nexport interface ChannelEvent extends ContactEvent {\n channel_event_type: string;\n duration: number;\n\n event: {\n type: string;\n channel: { uuid: string; name: string };\n duration?: number;\n optin?: {\n uuid: string;\n name: string;\n };\n };\n}\n\nexport interface ContactLanguageChangedEvent extends ContactEvent {\n language: string;\n step_uuid: string;\n session_uuid: string;\n}\n\nexport interface OptinRequestedEvent extends ContactEvent {\n optin: {\n uuid: string;\n name: string;\n };\n}\n\nexport interface MsgEvent extends ContactEvent {\n msg: Msg;\n status: string;\n failed_reason?: string;\n failed_reason_display?: string;\n logs_url: string;\n msg_type: string;\n recipient_count?: number;\n created_by?: User;\n optin?: ObjectReference;\n}\n\nexport interface FlowEvent extends ContactEvent {\n flow: ObjectReference;\n status: string;\n}\n\nexport interface EmailSentEvent extends ContactEvent {\n to: string[];\n subject: string;\n body: string;\n}\n\nexport interface URNsChangedEvent extends ContactEvent {\n urns: string[];\n}\n\nexport interface TicketEvent extends ContactEvent {\n note?: string;\n assignee?: User;\n ticket: {\n uuid: string;\n ticketer: ObjectReference;\n body: string;\n topic?: ObjectReference;\n external_id?: string;\n closed_on?: string;\n opened_on?: string;\n };\n created_by?: User;\n}\n\nexport interface LabelsAddedEvent extends ContactEvent {\n labels: ObjectReference[];\n}\n\nexport interface NameChangedEvent extends ContactEvent {\n name: string;\n}\n\nexport interface UpdateFieldEvent extends ContactEvent {\n field: { key: string; name: string };\n value: { text: string };\n}\n\nexport interface ErrorMessageEvent extends ContactEvent {\n text: string;\n}\n\nexport interface UpdateResultEvent extends ContactEvent {\n name: string;\n value: string;\n category: string;\n input: string;\n}\n\nexport interface ContactGroupsEvent extends ContactEvent {\n groups_added: ObjectReference[];\n groups_removed: ObjectReference[];\n}\n\nexport interface WebhookEvent extends ContactEvent {\n status: string;\n status_code: number;\n elapsed_ms: number;\n logs_url: string;\n url: string;\n}\n\nexport interface AirtimeTransferredEvent extends ContactEvent {\n sender: string;\n recipient: string;\n currency: string;\n desired_amount: string;\n actual_amount: string;\n logs_url: string;\n}\n\nexport type CallStartedEvent = ContactEvent;\nexport interface CampaignFiredEvent extends ContactEvent {\n campaign: { uuid: string; id: number; name: string };\n campaign_event: {\n id: number;\n offset_display: string;\n relative_to: { key: string; name: string };\n };\n fired_result: string;\n}\n\nexport interface ContactHistoryPage {\n has_older: boolean;\n recent_only: boolean;\n next_before: number;\n next_after: number;\n start_date: Date;\n events: ContactEvent[];\n}\n\nexport const getEventGroupType = (event: ContactEvent, ticket: string) => {\n if (!event) {\n return 'messages';\n }\n\n switch (event.type) {\n case Events.TICKET_ASSIGNED:\n case Events.TICKET_OPENED:\n case Events.TICKET_CLOSED:\n case Events.TICKET_REOPENED:\n if (!ticket) {\n return 'verbose';\n }\n\n if ((event as TicketEvent).ticket.uuid === ticket) {\n return 'tickets';\n }\n\n break;\n case Events.FLOW_ENTERED:\n case Events.FLOW_EXITED:\n return 'flows';\n case Events.BROADCAST_CREATED:\n case Events.MESSAGE_CREATED:\n case Events.MESSAGE_RECEIVED:\n case Events.IVR_CREATED:\n case Events.TICKET_NOTE_ADDED:\n case Events.NOTE_CREATED:\n return 'messages';\n }\n return 'verbose';\n};\n\nexport const renderUserAvatar = (user: User) => {\n return html`<div style=\"width:3.5em;font-size:0.8em\">\n ${renderAvatar({ user, position: 'left' })}\n </div>`;\n};\n\nexport const renderAttachment = (attachment: string): TemplateResult => {\n const idx = attachment.indexOf(':');\n const attType = attachment.substr(0, idx);\n const url = attachment.substr(idx + 1);\n const [mediaType, ext] = attType.split('/', 2);\n\n let inner = null;\n if (mediaType === 'image') {\n inner = html`\n <img src=\"${url}\" style=\"height:auto;width:100%;display:block;\" />\n `;\n } else if (ext === 'pdf') {\n return html`<div\n style=\"width:100%;height:300px;border-radius:calc(var(--curvature) * 2.5);box-shadow:0px 0px 12px 0px rgba(0,0,0,.1), 0px 0px 2px 0px rgba(0,0,0,.15);overflow:hidden\"\n ><embed src=\"${url}#view=Fit\" type=\"application/pdf\" frameBorder=\"0\" scrolling=\"auto\" height=\"100%\" width=\"100%\"></embed></div>`;\n } else if (mediaType === 'video') {\n return html`<video\n style=\"border-radius:var(--curvature);box-shadow:0px 0px 12px 0px rgba(0,0,0,.1), 0px 0px 2px 0px rgba(0,0,0,.15);max-width:400px\"\n height=\"auto\"\n controls\n >\n <source src=\"${url}\" type=\"video/mp4\" />\n </video> `;\n } else if (mediaType === 'audio') {\n return html`<audio\n style=\"border-radius: 99px; box-shadow:0px 0px 12px 0px rgba(0,0,0,.1), 0px 0px 2px 0px rgba(0,0,0,.15);\"\n src=\"${url}\"\n type=\"${attType}\"\n controls\n >\n <a target=\"_\" href=\"${url}\">${url}</a>\n </audio>`;\n } else if (attType === 'geo') {\n const [lat, long] = url.split(',');\n const latFloat = parseFloat(lat);\n const longFloat = parseFloat(long);\n const geo = `${lat}000000%2C${long}000000`;\n\n return html` <iframe\n style=\"border-radius: var(--curvature);box-shadow:0px 0px 12px 0px rgba(0,0,0,.1), 0px 0px 2px 0px rgba(0,0,0,.15);\"\n width=\"300\"\n height=\"300\"\n frameborder=\"0\"\n scrolling=\"no\"\n marginheight=\"0\"\n marginwidth=\"0\"\n src=\"https://www.openstreetmap.org/export/embed.html?bbox=${longFloat -\n 0.005}000000%2C${latFloat - 0.005}%2C${longFloat +\n 0.005}000000%2C${latFloat +\n 0.005}000000&layer=mapnik&marker=${geo}\"\n ></iframe>`;\n } else {\n return html`<div style=\"display:flex\">\n <temba-icon name=\"${Icon.download}\"></temba-icon>\n <div>Attachment ${ext}</div>\n </div>`;\n }\n\n return html`<div style=\"\">${inner}</div>`;\n};\n\nexport const renderMsgEvent = (\n event: MsgEvent,\n agent: string\n): TemplateResult => {\n const isInbound = event.type === Events.MESSAGE_RECEIVED;\n const isError = event.status === 'E';\n const isFailure = event.status === 'F';\n\n // summary items which appear under the message bubble\n const summary: TemplateResult[] = [];\n\n if (event.logs_url) {\n summary.push(html` <div class=\"icon-link\">\n <temba-icon\n onclick=\"goto(event)\"\n href=\"${event.logs_url}\"\n name=\"${Icon.log}\"\n class=\"log ${isError || isFailure ? 'error' : ''}\"\n ></temba-icon>\n </div>`);\n } else if (isError) {\n summary.push(\n html`<temba-icon\n title=\"Message delivery error\"\n name=\"${Icon.error}\"\n class=\"delivery-error\"\n ></temba-icon>`\n );\n } else if (isFailure) {\n summary.push(\n html`<temba-icon\n title=\"Message delivery failure: ${event.failed_reason_display}\"\n name=\"${Icon.error}\"\n class=\"delivery-error\"\n ></temba-icon>`\n );\n }\n\n if (event.type == 'broadcast_created') {\n summary.push(html`<temba-icon\n size=\"1\"\n class=\"broadcast\"\n name=\"${Icon.broadcast}\"\n ></temba-icon>`);\n\n if (event.recipient_count > 1) {\n summary.push(\n html`<div class=\"recipients\">${event.recipient_count} contacts</div>`\n );\n }\n summary.push(html`<div class=\"separator\">•</div>`);\n }\n\n if (event.optin) {\n summary.push(\n html`<div class=\"optin\">${event.optin.name}</div>\n <div class=\"separator\">•</div>`\n );\n }\n\n summary.push(\n html`<temba-date\n class=\"time\"\n value=\"${event.created_on}\"\n display=\"duration\"\n ></temba-date>`\n );\n\n return html`<div style=\"display:flex;align-items:flex-start\">\n <div style=\"display:flex;flex-direction:column\">\n <div\n class=\"${event.msg.text ? '' : 'no-message'} attachments-${(\n event.msg.attachments || []\n ).length} ${getClasses({\n msg: true,\n automated: !isInbound && !event.created_by,\n })}\"\n >\n ${event.msg.text\n ? html` <div class=\"text\">${event.msg.text}</div> `\n : null}\n ${event.msg.attachments\n ? html`<div class=\"attachments\">\n ${event.msg.attachments.map(\n attachment =>\n html` <div class=\"attachment\">\n ${renderAttachment(attachment)}\n </div>`\n )}\n </div> `\n : null}\n </div>\n\n ${!event.msg.text && !event.msg.attachments && !event.optin\n ? html`<div class=\"unsupported\">Unsupported Message</div>`\n : null}\n\n <div\n class=\"msg-summary\"\n style=\"flex-direction:row${isInbound ? '-reverse' : ''}\"\n >\n <div style=\"flex-grow:1\"></div>\n ${summary}\n </div>\n </div>\n\n ${!isInbound && event.created_by\n ? html`<div style=\"margin-left:0.8em;margin-top:0.3em;font-size:0.9em\">\n ${renderUserAvatar(event.created_by)}\n </div>`\n : null}\n </div>`;\n};\n\nexport const renderFlowEvent = (event: FlowEvent): TemplateResult => {\n let verb = 'Interrupted';\n let icon = Icon.flow_interrupted;\n\n if (event.status !== 'I') {\n if (event.type === Events.FLOW_ENTERED) {\n verb = 'Started';\n icon = Icon.flow;\n } else {\n verb = 'Completed';\n icon = Icon.flow;\n }\n }\n\n return html`\n <temba-icon name=\"${icon}\"></temba-icon>\n <div class=\"description\">\n ${verb}\n <span\n class=\"linked\"\n href=\"/flow/editor/${event.flow.uuid}/\"\n onclick=\"goto(event)\"\n >\n ${event.flow.name}\n </span>\n </div>\n `;\n};\n\nexport const renderResultEvent = (event: UpdateResultEvent): TemplateResult => {\n if (event.name.startsWith('_')) {\n return null;\n }\n return html`\n <temba-icon name=\"${Icon.updated}\"></temba-icon>\n <div class=\"description\">\n Updated\n <div class=\"attn\">${event.name}</div>\n to\n <div class=\"attn\">${event.value}</div>\n ${event.category\n ? html`with category\n <div class=\"attn\">${event.category}</div>`\n : null}\n </div>\n `;\n};\n\nexport const renderUpdateEvent = (event: UpdateFieldEvent): TemplateResult => {\n return html`\n <temba-icon name=\"${Icon.contact_updated}\"></temba-icon>\n <div class=\"description\">\n ${event.value\n ? html`Updated\n <div class=\"attn\">${event.field.name}</div>\n to\n <div class=\"attn\">${event.value.text}</div>`\n : html`Cleared\n <div class=\"attn\">${event.field.name}</div>`}\n </div>\n `;\n};\n\nexport const renderNameChanged = (event: NameChangedEvent): TemplateResult => {\n return html`\n <temba-icon name=\"${Icon.contact_updated}\"></temba-icon>\n <div class=\"description\">\n Updated\n <div class=\"attn\">Name</div>\n to\n <div class=\"attn\">${event.name}</div>\n </div>\n `;\n};\n\nexport const renderContactURNsChanged = (\n event: URNsChangedEvent\n): TemplateResult => {\n return html`\n <temba-icon name=\"${Icon.contact_updated}\"></temba-icon>\n <div class=\"description\">\n Updated\n <div class=\"attn\">URNs</div>\n to\n ${oxfordFn(\n event.urns,\n (urn: string) =>\n html`<div class=\"attn\">${urn.split(':')[1].split('?')[0]}</div>`\n )}\n </div>\n </div>\n `;\n};\n\nexport const renderEmailSent = (event: EmailSentEvent): TemplateResult => {\n return html`\n <temba-icon name=\"${Icon.email}\"></temba-icon>\n <div class=\"description\">\n Email sent to\n <div class=\"attn\">${oxford(event.to, 'and')}</div>\n with subject\n <div class=\"attn\">${event.subject}</div>\n </div>\n `;\n};\n\nexport const renderLabelsAdded = (event: LabelsAddedEvent): TemplateResult => {\n return html`\n <temba-icon name=\"${Icon.label}\"></temba-icon>\n <div class=\"description\">\n Message labeled with\n <div class=\"attn\">${oxfordNamed(event.labels, 'and')}</div>\n </div>\n `;\n};\n\nexport const renderNoteCreated = (event: TicketEvent): TemplateResult => {\n return html` <div style=\"display:flex;align-items:flex-start\">\n <div style=\"display:flex;flex-direction:column\">\n <div class=\"description\">${event.note}</div>\n <div class=\"note-summary\">\n <div style=\"flex-grow:1\"></div>\n <temba-date\n class=\"time\"\n value=\"${event.created_on}\"\n display=\"duration\"\n ></temba-date>\n </div>\n </div>\n <div style=\"margin-left:0.8em;margin-top:0.3em;font-size:0.8em\">\n ${renderUserAvatar(event.created_by)}\n </div>\n </div>`;\n};\n\nconst getTicketIcon = (event: TicketEvent) => {\n let icon = Icon.inbox;\n if (event.ticket.ticketer.name.indexOf('Email') > -1) {\n icon = Icon.email;\n } else if (event.ticket.ticketer.name.indexOf('Zendesk') > -1) {\n icon = Icon.zendesk;\n }\n return icon;\n};\n\nexport const renderTicketAction = (\n event: TicketEvent,\n action: string,\n grouped: boolean\n): TemplateResult => {\n const reopened = new Date(event.created_on);\n const icon = getTicketIcon(event);\n if (grouped) {\n return html`<div class=\"\" style=\"display: flex\">\n <temba-icon name=\"${icon}\"></temba-icon>\n <div class=\"description\">\n ${getDisplayName(event.created_by)} ${action} a\n <span\n onclick=\"goto(event)\"\n class=\"linked\"\n href=\"/ticket/all/open/${event.ticket.uuid}/\"\n >\n ticket\n </span>\n </div>\n </div>`;\n }\n\n return html`\n <div class=\"assigned active\">\n <div style=\"text-align:center\">\n ${event.created_by\n ? html` ${getDisplayName(event.created_by)} ${action} this ticket `\n : html` This ticket was ${action} `}\n </div>\n <div class=\"subtext\" style=\"justify-content:center\">\n <temba-date\n class=\"time\"\n value=\"${event.created_on}\"\n display=\"duration\"\n ></temba-date>\n </div>\n </div>\n `;\n};\n\nexport const renderTicketAssigned = (event: TicketEvent): TemplateResult => {\n return html`\n <div class=\"assigned active\">\n <div style=\"text-align:center\">\n ${event.assignee\n ? event.assignee.id === event.created_by.id\n ? html`${getDisplayName(event.created_by)} took this ticket`\n : html`${getDisplayName(event.created_by)} assigned this ticket to\n <div class=\"attn\">${getDisplayName(event.assignee)}</div>`\n : html`${getDisplayName(event.created_by)} unassigned this ticket`}\n </div>\n <div class=\"subtext\" style=\"justify-content:center\">\n <temba-date\n class=\"time\"\n value=\"${event.created_on}\"\n display=\"duration\"\n ></temba-date>\n </div>\n </div>\n `;\n};\n\nexport const renderTicketOpened = (\n event: TicketEvent,\n handleClose: (uuid: string) => void,\n grouped: boolean\n): TemplateResult => {\n const icon = getTicketIcon(event);\n\n if (grouped) {\n return html`<div class=\"\" style=\"display: flex\">\n <temba-icon name=\"${icon}\"></temba-icon>\n <div class=\"description\">\n ${event.ticket.topic.name}\n <span\n class=\"linked\"\n onclick=\"goto(event)\"\n href=\"/ticket/all/open/${event.ticket.uuid}\"\n >ticket</span\n >\n was opened\n </div>\n </div>`;\n } else {\n return html`\n <div>\n <div style=\"text-align:center\">\n ${getDisplayName(event.created_by)} opened this ticket\n </div>\n <div class=\"subtext\" style=\"justify-content:center\">\n <temba-date\n class=\"time\"\n value=\"${event.created_on}\"\n display=\"duration\"\n ></temba-date>\n </div>\n </div>\n `;\n }\n};\n\nexport const renderErrorMessage = (\n event: ErrorMessageEvent\n): TemplateResult => {\n return html`\n <temba-icon\n name=\"${Icon.error}\"\n style=\"--icon-color:var(--color-error)\"\n ></temba-icon>\n <div class=\"description\">\n ${event.text}\n ${event.type === Events.FAILURE\n ? html`<div>Run ended prematurely, check the flow design.</div>`\n : null}\n </div>\n `;\n};\n\nexport const renderWebhookEvent = (event: WebhookEvent): TemplateResult => {\n return html`\n <div\n class=\"${event.status === 'success' ? '' : 'failed'}\"\n style=\"display: flex\"\n >\n <temba-icon name=\"${Icon.webhook}\"></temba-icon>\n <div class=\"description\">\n ${event.status === 'success'\n ? html`Successfully called ${event.url}`\n : html`Failed to call ${event.url}`}\n </div>\n </div>\n `;\n};\n\nexport const renderAirtimeTransferredEvent = (\n event: AirtimeTransferredEvent\n): TemplateResult => {\n if (parseFloat(event.actual_amount) === 0) {\n return html`<temba-icon\n name=\"${Icon.error}\"\n style=\"--icon-color: var(--color-error)\"\n ></temba-icon>\n <div class=\"description error\">Airtime transfer failed</div>`;\n }\n\n return html`<temba-icon name=\"${Icon.airtime}\"></temba-icon>\n <div class=\"description\">\n Transferred\n <div class=\"attn\">${event.actual_amount} ${event.currency}</div>\n of airtime\n </div>`;\n};\n\nexport const renderCallStartedEvent = (): TemplateResult => {\n return html`<temba-icon name=\"${Icon.call}\"></temba-icon>\n <div class=\"description\">Call Started</div>`;\n};\n\nexport const renderContactLanguageChangedEvent = (\n event: ContactLanguageChangedEvent\n): TemplateResult => {\n return html`<temba-icon name=\"${Icon.contact_updated}\"></temba-icon>\n <div class=\"description\">\n Language updated to <span class=\"attn\">${event.language}</span>\n </div>`;\n};\n\nexport const renderOptinRequested = (\n event: OptinRequestedEvent\n): TemplateResult => {\n return html`<temba-icon name=\"${Icon.optin_requested}\"></temba-icon>\n <div class=\"description\">\n Requested opt-in for <span class=\"attn\">${event.optin.name}</span>\n </div>`;\n};\n\nexport const renderChannelEvent = (event: ChannelEvent): TemplateResult => {\n let eventMessage: string | TemplateResult = '';\n let icon = Icon.call;\n\n if (event.event.type === 'mt_miss') {\n eventMessage = 'Missed outgoing call';\n icon = Icon.call_missed;\n } else if (event.event.type === 'mo_miss') {\n eventMessage = 'Missed incoming call';\n icon = Icon.call_missed;\n } else if (event.event.type === 'new_conversation') {\n eventMessage = 'Started Conversation';\n icon = Icon.event;\n } else if (event.channel_event_type === 'welcome_message') {\n eventMessage = 'Welcome Message Sent';\n icon = Icon.event;\n } else if (event.event.type === 'referral') {\n eventMessage = 'Referred';\n icon = Icon.event;\n } else if (event.event.type === 'follow') {\n eventMessage = 'Followed';\n icon = Icon.event;\n } else if (event.event.type === 'stop_contact') {\n eventMessage = 'Stopped';\n icon = Icon.contact_stopped;\n } else if (event.event.type === 'mt_call') {\n eventMessage = 'Outgoing Phone Call';\n } else if (event.event.type == 'mo_call') {\n eventMessage = 'Incoming Phone call';\n } else if (event.event.type == 'optin') {\n eventMessage = html`Opted in to\n <span class=\"attn\">${event.event.optin?.name}</span>`;\n icon = Icon.optin;\n } else if (event.event.type == 'optout') {\n eventMessage = html`Opted out of\n <span class=\"attn\">${event.event.optin?.name}</span>`;\n icon = Icon.optout;\n }\n\n return html`<temba-icon name=\"${icon}\"></temba-icon>\n <div class=\"description\">${eventMessage}</div>`;\n};\n\nexport const renderCampaignFiredEvent = (\n event: CampaignFiredEvent\n): TemplateResult => {\n return html`<temba-icon name=\"${Icon.campaign}\"></temba-icon>\n <div class=\"description\">\n Campaign\n <span\n class=\"linked\"\n onclick=\"goto(event, this)\"\n href=\"/campaign/read/${event.campaign.uuid}/\"\n >${event.campaign.name}</span\n >\n ${event.fired_result === 'S' ? 'skipped' : 'triggered'}\n <span\n class=\"linked\"\n onclick=\"goto(event, this)\"\n href=\"/campaignevent/read/${event.campaign.uuid}/${event.campaign_event\n .id}/\"\n >\n ${event.campaign_event.offset_display}\n ${event.campaign_event.relative_to.name}</span\n >\n </div>`;\n};\n\nexport const renderContactGroupsEvent = (\n event: ContactGroupsEvent\n): TemplateResult => {\n const groups = event.groups_added || event.groups_removed;\n const added = !!event.groups_added;\n return html`\n <temba-icon\n name=\"${Icon.users}\"\n class=\"${getClasses({ added: added, removed: !added })}\"\n ></temba-icon>\n <div class=\"description\">\n ${added ? 'Added to' : 'Removed from'}\n ${oxfordFn(\n groups,\n (group: ObjectReference) =>\n html`<span\n class=\"linked\"\n onclick=\"goto(event)\"\n href=\"/contact/filter/${group.uuid}\"\n >${group.name}</span\n >`\n )}\n ${event.type === Events.FAILURE\n ? html`<div>Run ended prematurely, check the flow design.</div>`\n : null}\n </div>\n `;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/contacts/events.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, EventPart, html, TemplateResult } from 'lit';\nimport { Msg, ObjectReference, User } from '../interfaces';\nimport {\n getClasses,\n NamedObject,\n oxford,\n oxfordFn,\n oxfordNamed,\n renderAvatar,\n} from '../utils';\nimport { Icon } from '../vectoricon';\nimport { getDisplayName } from './helpers';\n\nexport const getEventStyles = () => {\n return css`\n .grouping {\n margin-top: 1em;\n }\n\n .grouping.verbose {\n background: #f9f9f9;\n color: var(--color-dark);\n --color-link-primary: rgba(38, 166, 230, 1);\n pointer-events: none;\n background: #fefefe;\n box-shadow: -8px 0px 8px 1px rgba(0, 0, 0, 0.05) inset;\n margin-right: -16px;\n padding-right: 16px;\n margin-bottom: 1.3em;\n max-width: 100%;\n }\n\n .grouping .items {\n display: block;\n }\n\n .grouping.verbose .items {\n opacity: 0;\n max-height: 0;\n display: flex;\n flex-direction: column;\n user-select: none;\n }\n\n .grouping.flows .items {\n padding: 0;\n }\n\n .grouping.messages .items {\n display: flex;\n flex-direction: column;\n margin: 0em 0.75em;\n }\n\n .grouping.verbose.expanded .items {\n transition: max-height var(--transition-speed) ease-in-out,\n opacity var(--transition-speed) ease-in-out;\n opacity: 1;\n max-height: 1000px;\n padding: 1em 1em;\n }\n\n .grouping.verbose.expanded {\n border-top: 1px solid #f3f3f3;\n border-bottom: 1px solid #f3f3f3;\n }\n\n .grouping.verbose.expanded,\n .grouping.verbose .event-count {\n pointer-events: auto;\n }\n\n .grouping.verbose temba-icon {\n }\n\n .grouping.verbose > .event,\n .grouping.verbose > pre {\n max-height: 0px;\n padding-top: 0;\n padding-bottom: 0;\n margin-top: 0;\n margin-bottom: 0;\n opacity: 0;\n }\n\n .grouping.verbose .attn {\n color: #666;\n }\n\n .event-count {\n position: relative;\n font-size: 0.8em;\n text-align: center;\n margin: 0 auto;\n display: table;\n padding: 3px 10px;\n font-weight: 400;\n color: #999;\n cursor: pointer;\n width: 100%;\n opacity: 1;\n z-index: 1;\n }\n\n .event-count temba-icon {\n display: inline-block;\n position: absolute;\n right: 5px;\n top: 5px;\n }\n\n .event-count:hover {\n color: var(--color-link-primary-hover);\n }\n\n .expanded .event-count {\n padding: 0;\n pointer-events: none;\n }\n\n .grouping.flows {\n margin-left: 1em;\n margin-right: 1em;\n margin-bottom: 1.5em;\n\n border: 1px solid #f2f2f2;\n border-radius: var(--curvature);\n padding: 0.5em 1em;\n }\n\n .grouping.flows .event {\n margin: 0;\n padding: 0;\n }\n\n .grouping.tickets {\n margin-bottom: 2em;\n }\n\n pre {\n white-space: pre-wrap;\n word-wrap: break-word;\n }\n\n .grouping.verbose.expanded .event,\n .grouping.verbose.expanded pre {\n max-height: 500px;\n opacity: 1;\n }\n\n .grouping-close-button {\n position: relative;\n display: inline-block;\n opacity: 0;\n float: right;\n --icon-color: #666;\n }\n\n .grouping.verbose.expanded:hover .grouping-close-button {\n opacity: 1;\n }\n\n .grouping.messages,\n .grouping.tickets {\n display: flex;\n flex-direction: column;\n }\n\n .event {\n margin: 0.25em 0.5em;\n border-radius: var(--curvature);\n flex-grow: 1;\n }\n\n .msg {\n border-radius: calc(var(--curvature) * 2.5);\n border: 2px solid rgba(100, 100, 100, 0.1);\n max-width: 300px;\n word-break: break-word;\n overflow: hidden;\n }\n\n .msg.attachments-1.no-message {\n border: 2px solid transparent;\n background-color: transparent !important;\n }\n\n .msg .text {\n padding: var(--event-padding);\n }\n\n .event.msg_received .msg {\n background: rgba(200, 200, 200, 0.1);\n }\n\n .event.msg_created,\n .event.broadcast_created,\n .event.ivr_created,\n .event.ticket_note_added {\n align-self: flex-end;\n }\n\n .event.msg_created .msg,\n .event.broadcast_created .msg,\n .event.ivr_created .msg {\n background: var(--color-primary-dark);\n color: white;\n font-weight: 400;\n }\n\n .msg.automated {\n background: var(--color-automated) !important;\n }\n\n .queued {\n opacity: 0.3;\n }\n\n .optin_requested {\n --icon-color: var(--color-primary-dark);\n }\n\n .webhook_called {\n --icon-color: #e68628;\n word-break: break-all;\n }\n\n .webhook_called .failed {\n --icon-color: var(--color-error);\n color: var(--color-error);\n }\n\n .input_labels_added,\n .contact_name_changed,\n .contact_field_changed,\n .contact_urns_changed,\n .contact_language_changed,\n .run_result_changed {\n --icon-color: rgba(1, 193, 175, 1);\n }\n\n .email_sent {\n --icon-color: #8e5ea7;\n }\n\n .contact_groups_changed .added {\n --icon-color: #309c42;\n }\n .contact_groups_changed .removed {\n --icon-color: var(--color-error);\n }\n\n .event.error .description,\n .event.failure .description {\n color: var(--color-error);\n }\n\n .description.error {\n color: var(--color-error);\n }\n\n .info {\n border: 1px solid rgba(100, 100, 100, 0.2);\n background: rgba(10, 10, 10, 0.02);\n }\n\n .ticket_note_added {\n max-width: 300px;\n }\n\n .note-summary {\n display: flex;\n flex-direction: row;\n font-size: 85%;\n margin-top: -0.5em;\n color: rgba(0, 0, 0, 0.6);\n padding: 8px 3px;\n }\n\n .ticket_note_added .description {\n border: 2px solid rgba(100, 100, 100, 0.1);\n background: rgb(255, 249, 194);\n padding: var(--event-padding);\n font-weight: 400;\n color: rgba(0, 0, 0, 0.6);\n border-radius: calc(var(--curvature) * 2.5);\n }\n\n .channel_event {\n --icon-color: rgb(200, 200, 200);\n }\n\n .airtime_transferred,\n .flow_exited,\n .flow_entered,\n .ticket_opened,\n .ticket_reopened,\n .ticket_closed,\n .call_started,\n .campaign_fired {\n --icon-color: rgba(223, 65, 159, 1);\n }\n\n .active-ticket.ticket_opened {\n padding: 0em 1em;\n }\n\n .ticket_closed .inactive .subtext {\n display: none;\n }\n\n .attn {\n color: var(--color-text);\n }\n\n .flow_exited,\n .flow_entered {\n align-self: center;\n max-width: 80%;\n display: flex;\n flex-direction: row;\n }\n\n .flow_exited temba-icon,\n .flow_entered temba-icon {\n }\n\n .event {\n display: flex;\n align-items: center;\n }\n\n .event .description {\n flex-grow: 1;\n }\n\n .msg-summary {\n display: flex;\n font-size: 85%;\n color: rgba(0, 0, 0, 0.6);\n padding: 6px 3px;\n margin-bottom: 0.5em;\n margin-top: -0.5em;\n }\n\n .msg-summary temba-icon.log {\n --icon-color: rgba(0, 0, 0, 0.2);\n }\n\n .msg-summary temba-icon.log:hover {\n --icon-color: var(--color-link-primary-hover);\n cursor: pointer;\n }\n\n .msg-summary temba-icon.error {\n --icon-color: rgba(var(--error-rgb), 0.75);\n }\n\n .msg-summary temba-icon.error:hover {\n --icon-color: var(--color-error);\n cursor: pointer;\n }\n\n .msg-summary temba-icon.broadcast {\n --icon-color: rgba(90, 90, 90, 0.5);\n }\n\n .msg-summary * {\n display: flex;\n margin-right: 1px;\n margin-left: 1px;\n }\n\n .unsupported {\n border: 1px solid #f2f2f2;\n color: #999;\n padding: 0.5em 1em;\n border-radius: var(--curvature);\n }\n\n .optin {\n align-items: center;\n padding: 0 0.2em;\n }\n\n .time {\n padding: 0.3em 1px;\n }\n\n .subtext .time {\n padding: 0em;\n }\n\n .status {\n padding: 0.3em 3px;\n }\n\n .separator {\n padding: 0.3em 0px;\n }\n\n .recipients {\n padding: 0.3em 3px;\n }\n\n .verbose temba-icon,\n .flows temba-icon,\n .tickets temba-icon {\n margin-right: 0.75em;\n }\n\n .attn {\n display: inline-block;\n font-weight: 500;\n margin: 0px 2px;\n word-break: break-all;\n white-space: break-spaces;\n }\n\n .subtext {\n font-size: 80%;\n }\n\n .body-pre {\n white-space: pre-wrap;\n word-wrap: break-word;\n font-size: 90%;\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 temba-icon.error {\n --icon-color: var(--color-error);\n }\n\n .delivery-error {\n --icon-color: var(--color-error);\n margin-right: 0.25em;\n }\n\n .flow {\n --icon-color: #ddd;\n background: #fff;\n width: 18px;\n height: 18px;\n padding-top: 4px;\n padding-left: 9px;\n border: 0px solid #f3f3f3;\n }\n\n .assigned {\n color: #777;\n max-width: 300px;\n margin-left: auto;\n margin-right: auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n margin-bottom: 10px;\n }\n\n .assigned .attn {\n color: #777;\n }\n\n .attachments {\n display: flex;\n flex-wrap: wrap;\n margin: -0.2em;\n }\n\n .attachment {\n flex: 1 0 45%;\n border-top: 0.05em solid transparent;\n border-left: 0.05em solid transparent;\n margin-top: 0.05em;\n margin-left: 0.05em;\n }\n `;\n};\n\nexport interface EventGroup {\n type: string;\n events: ContactEvent[];\n open: boolean;\n}\n\nexport enum Events {\n MESSAGE_CREATED = 'msg_created',\n MESSAGE_RECEIVED = 'msg_received',\n BROADCAST_CREATED = 'broadcast_created',\n IVR_CREATED = 'ivr_created',\n FLOW_ENTERED = 'flow_entered',\n FLOW_EXITED = 'flow_exited',\n RUN_RESULT_CHANGED = 'run_result_changed',\n CONTACT_FIELD_CHANGED = 'contact_field_changed',\n CONTACT_GROUPS_CHANGED = 'contact_groups_changed',\n CONTACT_NAME_CHANGED = 'contact_name_changed',\n CONTACT_URNS_CHANGED = 'contact_urns_changed',\n CAMPAIGN_FIRED = 'campaign_fired',\n CHANNEL_EVENT = 'channel_event',\n CONTACT_LANGUAGE_CHANGED = 'contact_language_changed',\n WEBHOOK_CALLED = 'webhook_called',\n AIRTIME_TRANSFERRED = 'airtime_transferred',\n CALL_STARTED = 'call_started',\n EMAIL_SENT = 'email_sent',\n INPUT_LABELS_ADDED = 'input_labels_added',\n NOTE_CREATED = 'note_created',\n TICKET_ASSIGNED = 'ticket_assigned',\n TICKET_NOTE_ADDED = 'ticket_note_added',\n TICKET_CLOSED = 'ticket_closed',\n TICKET_OPENED = 'ticket_opened',\n TICKET_REOPENED = 'ticket_reopened',\n OPTIN_REQUESTED = 'optin_requested',\n ERROR = 'error',\n FAILURE = 'failure',\n}\n\nexport interface ContactEvent {\n type: string;\n created_on: string;\n}\n\nexport interface ChannelEvent extends ContactEvent {\n channel_event_type: string;\n duration: number;\n\n event: {\n type: string;\n channel: { uuid: string; name: string };\n duration?: number;\n optin?: {\n uuid: string;\n name: string;\n };\n };\n}\n\nexport interface ContactLanguageChangedEvent extends ContactEvent {\n language: string;\n step_uuid: string;\n session_uuid: string;\n}\n\nexport interface OptinRequestedEvent extends ContactEvent {\n optin: {\n uuid: string;\n name: string;\n };\n}\n\nexport interface MsgEvent extends ContactEvent {\n msg: Msg;\n status: string;\n failed_reason?: string;\n failed_reason_display?: string;\n logs_url: string;\n msg_type: string;\n recipient_count?: number;\n created_by?: User;\n optin?: ObjectReference;\n}\n\nexport interface FlowEvent extends ContactEvent {\n flow: ObjectReference;\n status: string;\n}\n\nexport interface EmailSentEvent extends ContactEvent {\n to: string[];\n subject: string;\n body: string;\n}\n\nexport interface URNsChangedEvent extends ContactEvent {\n urns: string[];\n}\n\nexport interface TicketEvent extends ContactEvent {\n note?: string;\n assignee?: User;\n ticket: {\n uuid: string;\n ticketer: ObjectReference;\n body: string;\n topic?: ObjectReference;\n external_id?: string;\n closed_on?: string;\n opened_on?: string;\n };\n created_by?: User;\n}\n\nexport interface LabelsAddedEvent extends ContactEvent {\n labels: ObjectReference[];\n}\n\nexport interface NameChangedEvent extends ContactEvent {\n name: string;\n}\n\nexport interface UpdateFieldEvent extends ContactEvent {\n field: { key: string; name: string };\n value: { text: string };\n}\n\nexport interface ErrorMessageEvent extends ContactEvent {\n text: string;\n}\n\nexport interface UpdateResultEvent extends ContactEvent {\n name: string;\n value: string;\n category: string;\n input: string;\n}\n\nexport interface ContactGroupsEvent extends ContactEvent {\n groups_added: ObjectReference[];\n groups_removed: ObjectReference[];\n}\n\nexport interface WebhookEvent extends ContactEvent {\n status: string;\n status_code: number;\n elapsed_ms: number;\n logs_url: string;\n url: string;\n}\n\nexport interface AirtimeTransferredEvent extends ContactEvent {\n sender: string;\n recipient: string;\n currency: string;\n desired_amount: string;\n actual_amount: string;\n logs_url: string;\n}\n\nexport type CallStartedEvent = ContactEvent;\nexport interface CampaignFiredEvent extends ContactEvent {\n campaign: { uuid: string; id: number; name: string };\n campaign_event: {\n id: number;\n offset_display: string;\n relative_to: { key: string; name: string };\n };\n fired_result: string;\n}\n\nexport interface ContactHistoryPage {\n has_older: boolean;\n recent_only: boolean;\n next_before: number;\n next_after: number;\n start_date: Date;\n events: ContactEvent[];\n}\n\nexport const getEventGroupType = (event: ContactEvent, ticket: string) => {\n if (!event) {\n return 'messages';\n }\n\n switch (event.type) {\n case Events.TICKET_ASSIGNED:\n case Events.TICKET_OPENED:\n case Events.TICKET_CLOSED:\n case Events.TICKET_REOPENED:\n if (!ticket) {\n return 'verbose';\n }\n\n if ((event as TicketEvent).ticket.uuid === ticket) {\n return 'tickets';\n }\n\n break;\n case Events.FLOW_ENTERED:\n case Events.FLOW_EXITED:\n return 'flows';\n case Events.BROADCAST_CREATED:\n case Events.MESSAGE_CREATED:\n case Events.MESSAGE_RECEIVED:\n case Events.IVR_CREATED:\n case Events.TICKET_NOTE_ADDED:\n case Events.NOTE_CREATED:\n return 'messages';\n }\n return 'verbose';\n};\n\nexport const renderUserAvatar = (user: User) => {\n return html`<div style=\"width:3.5em;font-size:0.8em\">\n ${renderAvatar({ user, position: 'left' })}\n </div>`;\n};\n\nexport const renderAttachment = (attachment: string): TemplateResult => {\n const idx = attachment.indexOf(':');\n const attType = attachment.substr(0, idx);\n const url = attachment.substr(idx + 1);\n const [mediaType, ext] = attType.split('/', 2);\n\n let inner = null;\n if (mediaType === 'image') {\n inner = html`\n <img src=\"${url}\" style=\"height:auto;width:100%;display:block;\" />\n `;\n } else if (ext === 'pdf') {\n return html`<div\n style=\"width:100%;height:300px;border-radius:calc(var(--curvature) * 2.5);box-shadow:0px 0px 12px 0px rgba(0,0,0,.1), 0px 0px 2px 0px rgba(0,0,0,.15);overflow:hidden\"\n ><embed src=\"${url}#view=Fit\" type=\"application/pdf\" frameBorder=\"0\" scrolling=\"auto\" height=\"100%\" width=\"100%\"></embed></div>`;\n } else if (mediaType === 'video') {\n return html`<video\n style=\"border-radius:var(--curvature);box-shadow:0px 0px 12px 0px rgba(0,0,0,.1), 0px 0px 2px 0px rgba(0,0,0,.15);max-width:400px\"\n height=\"auto\"\n controls\n >\n <source src=\"${url}\" type=\"video/mp4\" />\n </video> `;\n } else if (mediaType === 'audio') {\n return html`<audio\n style=\"border-radius: 99px; box-shadow:0px 0px 12px 0px rgba(0,0,0,.1), 0px 0px 2px 0px rgba(0,0,0,.15);\"\n src=\"${url}\"\n type=\"${attType}\"\n controls\n >\n <a target=\"_\" href=\"${url}\">${url}</a>\n </audio>`;\n } else if (attType === 'geo') {\n const [lat, long] = url.split(',');\n const latFloat = parseFloat(lat);\n const longFloat = parseFloat(long);\n const geo = `${lat}000000%2C${long}000000`;\n\n return html` <iframe\n style=\"border-radius: var(--curvature);box-shadow:0px 0px 12px 0px rgba(0,0,0,.1), 0px 0px 2px 0px rgba(0,0,0,.15);\"\n width=\"300\"\n height=\"300\"\n frameborder=\"0\"\n scrolling=\"no\"\n marginheight=\"0\"\n marginwidth=\"0\"\n src=\"https://www.openstreetmap.org/export/embed.html?bbox=${longFloat -\n 0.005}000000%2C${latFloat - 0.005}%2C${longFloat +\n 0.005}000000%2C${latFloat +\n 0.005}000000&layer=mapnik&marker=${geo}\"\n ></iframe>`;\n } else {\n return html`<div style=\"display:flex\">\n <temba-icon name=\"${Icon.download}\"></temba-icon>\n <div>Attachment ${ext}</div>\n </div>`;\n }\n\n return html`<div style=\"\">${inner}</div>`;\n};\n\nexport const renderMsgEvent = (\n event: MsgEvent,\n agent: string\n): TemplateResult => {\n const isInbound = event.type === Events.MESSAGE_RECEIVED;\n const isError = event.status === 'E';\n const isFailure = event.status === 'F';\n\n // summary items which appear under the message bubble\n const summary: TemplateResult[] = [];\n\n if (event.logs_url) {\n summary.push(html` <div class=\"icon-link\">\n <temba-icon\n onclick=\"goto(event)\"\n href=\"${event.logs_url}\"\n name=\"${Icon.log}\"\n class=\"log ${isError || isFailure ? 'error' : ''}\"\n ></temba-icon>\n </div>`);\n } else if (isError) {\n summary.push(\n html`<temba-icon\n title=\"Message delivery error\"\n name=\"${Icon.error}\"\n class=\"delivery-error\"\n ></temba-icon>`\n );\n } else if (isFailure) {\n summary.push(\n html`<temba-icon\n title=\"Message delivery failure: ${event.failed_reason_display}\"\n name=\"${Icon.error}\"\n class=\"delivery-error\"\n ></temba-icon>`\n );\n }\n\n if (event.type == 'broadcast_created') {\n summary.push(html`<temba-icon\n size=\"1\"\n class=\"broadcast\"\n name=\"${Icon.broadcast}\"\n ></temba-icon>`);\n\n if (event.recipient_count > 1) {\n summary.push(\n html`<div class=\"recipients\">${event.recipient_count} contacts</div>`\n );\n }\n summary.push(html`<div class=\"separator\">•</div>`);\n }\n\n if (event.optin) {\n summary.push(\n html`<div class=\"optin\">${event.optin.name}</div>\n <div class=\"separator\">•</div>`\n );\n }\n\n if (event.status === 'Q') {\n summary.push(html`<div>Queued</div>`);\n }\n\n summary.push(\n html`<temba-date\n class=\"time\"\n value=\"${event.created_on}\"\n display=\"duration\"\n ></temba-date>`\n );\n\n return html`<div\n style=\"display:flex;align-items:flex-start\"\n class=${getClasses({ queued: event.status === 'Q' })}\n >\n <div style=\"display:flex;flex-direction:column\">\n <div\n class=\"${event.msg.text ? '' : 'no-message'} attachments-${(\n event.msg.attachments || []\n ).length} ${getClasses({\n msg: true,\n automated: !isInbound && !event.created_by,\n })}\"\n >\n ${event.msg.text\n ? html` <div class=\"text\">${event.msg.text}</div> `\n : null}\n ${event.msg.attachments\n ? html`<div class=\"attachments\">\n ${event.msg.attachments.map(\n attachment =>\n html` <div class=\"attachment\">\n ${renderAttachment(attachment)}\n </div>`\n )}\n </div> `\n : null}\n </div>\n\n ${!event.msg.text && !event.msg.attachments && !event.optin\n ? html`<div class=\"unsupported\">Unsupported Message</div>`\n : null}\n\n <div\n class=\"msg-summary\"\n style=\"align-items:center;flex-direction:row${isInbound\n ? '-reverse'\n : ''}\"\n >\n <div style=\"flex-grow:1\"></div>\n ${summary}\n </div>\n </div>\n\n ${!isInbound && event.created_by\n ? html`<div style=\"margin-left:0.8em;margin-top:0.3em;font-size:0.9em\">\n ${renderUserAvatar(event.created_by)}\n </div>`\n : null}\n </div>`;\n};\n\nexport const renderFlowEvent = (event: FlowEvent): TemplateResult => {\n let verb = 'Interrupted';\n let icon = Icon.flow_interrupted;\n\n if (event.status !== 'I') {\n if (event.type === Events.FLOW_ENTERED) {\n verb = 'Started';\n icon = Icon.flow;\n } else {\n verb = 'Completed';\n icon = Icon.flow;\n }\n }\n\n return html`\n <temba-icon name=\"${icon}\"></temba-icon>\n <div class=\"description\">\n ${verb}\n <span\n class=\"linked\"\n href=\"/flow/editor/${event.flow.uuid}/\"\n onclick=\"goto(event)\"\n >\n ${event.flow.name}\n </span>\n </div>\n `;\n};\n\nexport const renderResultEvent = (event: UpdateResultEvent): TemplateResult => {\n if (event.name.startsWith('_')) {\n return null;\n }\n return html`\n <temba-icon name=\"${Icon.updated}\"></temba-icon>\n <div class=\"description\">\n Updated\n <div class=\"attn\">${event.name}</div>\n to\n <div class=\"attn\">${event.value}</div>\n ${event.category\n ? html`with category\n <div class=\"attn\">${event.category}</div>`\n : null}\n </div>\n `;\n};\n\nexport const renderUpdateEvent = (event: UpdateFieldEvent): TemplateResult => {\n return html`\n <temba-icon name=\"${Icon.contact_updated}\"></temba-icon>\n <div class=\"description\">\n ${event.value\n ? html`Updated\n <div class=\"attn\">${event.field.name}</div>\n to\n <div class=\"attn\">${event.value.text}</div>`\n : html`Cleared\n <div class=\"attn\">${event.field.name}</div>`}\n </div>\n `;\n};\n\nexport const renderNameChanged = (event: NameChangedEvent): TemplateResult => {\n return html`\n <temba-icon name=\"${Icon.contact_updated}\"></temba-icon>\n <div class=\"description\">\n Updated\n <div class=\"attn\">Name</div>\n to\n <div class=\"attn\">${event.name}</div>\n </div>\n `;\n};\n\nexport const renderContactURNsChanged = (\n event: URNsChangedEvent\n): TemplateResult => {\n return html`\n <temba-icon name=\"${Icon.contact_updated}\"></temba-icon>\n <div class=\"description\">\n Updated\n <div class=\"attn\">URNs</div>\n to\n ${oxfordFn(\n event.urns,\n (urn: string) =>\n html`<div class=\"attn\">${urn.split(':')[1].split('?')[0]}</div>`\n )}\n </div>\n </div>\n `;\n};\n\nexport const renderEmailSent = (event: EmailSentEvent): TemplateResult => {\n return html`\n <temba-icon name=\"${Icon.email}\"></temba-icon>\n <div class=\"description\">\n Email sent to\n <div class=\"attn\">${oxford(event.to, 'and')}</div>\n with subject\n <div class=\"attn\">${event.subject}</div>\n </div>\n `;\n};\n\nexport const renderLabelsAdded = (event: LabelsAddedEvent): TemplateResult => {\n return html`\n <temba-icon name=\"${Icon.label}\"></temba-icon>\n <div class=\"description\">\n Message labeled with\n <div class=\"attn\">${oxfordNamed(event.labels, 'and')}</div>\n </div>\n `;\n};\n\nexport const renderNoteCreated = (event: TicketEvent): TemplateResult => {\n return html` <div style=\"display:flex;align-items:flex-start\">\n <div style=\"display:flex;flex-direction:column\">\n <div class=\"description\">${event.note}</div>\n <div class=\"note-summary\">\n <div style=\"flex-grow:1\"></div>\n <temba-date\n class=\"time\"\n value=\"${event.created_on}\"\n display=\"duration\"\n ></temba-date>\n </div>\n </div>\n <div style=\"margin-left:0.8em;margin-top:0.3em;font-size:0.8em\">\n ${renderUserAvatar(event.created_by)}\n </div>\n </div>`;\n};\n\nconst getTicketIcon = (event: TicketEvent) => {\n let icon = Icon.inbox;\n if (event.ticket.ticketer.name.indexOf('Email') > -1) {\n icon = Icon.email;\n } else if (event.ticket.ticketer.name.indexOf('Zendesk') > -1) {\n icon = Icon.zendesk;\n }\n return icon;\n};\n\nexport const renderTicketAction = (\n event: TicketEvent,\n action: string,\n grouped: boolean\n): TemplateResult => {\n const reopened = new Date(event.created_on);\n const icon = getTicketIcon(event);\n if (grouped) {\n return html`<div class=\"\" style=\"display: flex\">\n <temba-icon name=\"${icon}\"></temba-icon>\n <div class=\"description\">\n ${getDisplayName(event.created_by)} ${action} a\n <span\n onclick=\"goto(event)\"\n class=\"linked\"\n href=\"/ticket/all/open/${event.ticket.uuid}/\"\n >\n ticket\n </span>\n </div>\n </div>`;\n }\n\n return html`\n <div class=\"assigned active\">\n <div style=\"text-align:center\">\n ${event.created_by\n ? html` ${getDisplayName(event.created_by)} ${action} this ticket `\n : html` This ticket was ${action} `}\n </div>\n <div class=\"subtext\" style=\"justify-content:center\">\n <temba-date\n class=\"time\"\n value=\"${event.created_on}\"\n display=\"duration\"\n ></temba-date>\n </div>\n </div>\n `;\n};\n\nexport const renderTicketAssigned = (event: TicketEvent): TemplateResult => {\n return html`\n <div class=\"assigned active\">\n <div style=\"text-align:center\">\n ${event.assignee\n ? event.assignee.id === event.created_by.id\n ? html`${getDisplayName(event.created_by)} took this ticket`\n : html`${getDisplayName(event.created_by)} assigned this ticket to\n <div class=\"attn\">${getDisplayName(event.assignee)}</div>`\n : html`${getDisplayName(event.created_by)} unassigned this ticket`}\n </div>\n <div class=\"subtext\" style=\"justify-content:center\">\n <temba-date\n class=\"time\"\n value=\"${event.created_on}\"\n display=\"duration\"\n ></temba-date>\n </div>\n </div>\n `;\n};\n\nexport const renderTicketOpened = (\n event: TicketEvent,\n handleClose: (uuid: string) => void,\n grouped: boolean\n): TemplateResult => {\n const icon = getTicketIcon(event);\n\n if (grouped) {\n return html`<div class=\"\" style=\"display: flex\">\n <temba-icon name=\"${icon}\"></temba-icon>\n <div class=\"description\">\n ${event.ticket.topic.name}\n <span\n class=\"linked\"\n onclick=\"goto(event)\"\n href=\"/ticket/all/open/${event.ticket.uuid}\"\n >ticket</span\n >\n was opened\n </div>\n </div>`;\n } else {\n return html`\n <div>\n <div style=\"text-align:center\">\n ${getDisplayName(event.created_by)} opened this ticket\n </div>\n <div class=\"subtext\" style=\"justify-content:center\">\n <temba-date\n class=\"time\"\n value=\"${event.created_on}\"\n display=\"duration\"\n ></temba-date>\n </div>\n </div>\n `;\n }\n};\n\nexport const renderErrorMessage = (\n event: ErrorMessageEvent\n): TemplateResult => {\n return html`\n <temba-icon\n name=\"${Icon.error}\"\n style=\"--icon-color:var(--color-error)\"\n ></temba-icon>\n <div class=\"description\">\n ${event.text}\n ${event.type === Events.FAILURE\n ? html`<div>Run ended prematurely, check the flow design.</div>`\n : null}\n </div>\n `;\n};\n\nexport const renderWebhookEvent = (event: WebhookEvent): TemplateResult => {\n return html`\n <div\n class=\"${event.status === 'success' ? '' : 'failed'}\"\n style=\"display: flex\"\n >\n <temba-icon name=\"${Icon.webhook}\"></temba-icon>\n <div class=\"description\">\n ${event.status === 'success'\n ? html`Successfully called ${event.url}`\n : html`Failed to call ${event.url}`}\n </div>\n </div>\n `;\n};\n\nexport const renderAirtimeTransferredEvent = (\n event: AirtimeTransferredEvent\n): TemplateResult => {\n if (parseFloat(event.actual_amount) === 0) {\n return html`<temba-icon\n name=\"${Icon.error}\"\n style=\"--icon-color: var(--color-error)\"\n ></temba-icon>\n <div class=\"description error\">Airtime transfer failed</div>`;\n }\n\n return html`<temba-icon name=\"${Icon.airtime}\"></temba-icon>\n <div class=\"description\">\n Transferred\n <div class=\"attn\">${event.actual_amount} ${event.currency}</div>\n of airtime\n </div>`;\n};\n\nexport const renderCallStartedEvent = (): TemplateResult => {\n return html`<temba-icon name=\"${Icon.call}\"></temba-icon>\n <div class=\"description\">Call Started</div>`;\n};\n\nexport const renderContactLanguageChangedEvent = (\n event: ContactLanguageChangedEvent\n): TemplateResult => {\n return html`<temba-icon name=\"${Icon.contact_updated}\"></temba-icon>\n <div class=\"description\">\n Language updated to <span class=\"attn\">${event.language}</span>\n </div>`;\n};\n\nexport const renderOptinRequested = (\n event: OptinRequestedEvent\n): TemplateResult => {\n return html`<temba-icon name=\"${Icon.optin_requested}\"></temba-icon>\n <div class=\"description\">\n Requested opt-in for <span class=\"attn\">${event.optin.name}</span>\n </div>`;\n};\n\nexport const renderChannelEvent = (event: ChannelEvent): TemplateResult => {\n let eventMessage: string | TemplateResult = '';\n let icon = Icon.call;\n\n if (event.event.type === 'mt_miss') {\n eventMessage = 'Missed outgoing call';\n icon = Icon.call_missed;\n } else if (event.event.type === 'mo_miss') {\n eventMessage = 'Missed incoming call';\n icon = Icon.call_missed;\n } else if (event.event.type === 'new_conversation') {\n eventMessage = 'Started Conversation';\n icon = Icon.event;\n } else if (event.channel_event_type === 'welcome_message') {\n eventMessage = 'Welcome Message Sent';\n icon = Icon.event;\n } else if (event.event.type === 'referral') {\n eventMessage = 'Referred';\n icon = Icon.event;\n } else if (event.event.type === 'follow') {\n eventMessage = 'Followed';\n icon = Icon.event;\n } else if (event.event.type === 'stop_contact') {\n eventMessage = 'Stopped';\n icon = Icon.contact_stopped;\n } else if (event.event.type === 'mt_call') {\n eventMessage = 'Outgoing Phone Call';\n } else if (event.event.type == 'mo_call') {\n eventMessage = 'Incoming Phone call';\n } else if (event.event.type == 'optin') {\n eventMessage = html`Opted in to\n <span class=\"attn\">${event.event.optin?.name}</span>`;\n icon = Icon.optin;\n } else if (event.event.type == 'optout') {\n eventMessage = html`Opted out of\n <span class=\"attn\">${event.event.optin?.name}</span>`;\n icon = Icon.optout;\n }\n\n return html`<temba-icon name=\"${icon}\"></temba-icon>\n <div class=\"description\">${eventMessage}</div>`;\n};\n\nexport const renderCampaignFiredEvent = (\n event: CampaignFiredEvent\n): TemplateResult => {\n return html`<temba-icon name=\"${Icon.campaign}\"></temba-icon>\n <div class=\"description\">\n Campaign\n <span\n class=\"linked\"\n onclick=\"goto(event, this)\"\n href=\"/campaign/read/${event.campaign.uuid}/\"\n >${event.campaign.name}</span\n >\n ${event.fired_result === 'S' ? 'skipped' : 'triggered'}\n <span\n class=\"linked\"\n onclick=\"goto(event, this)\"\n href=\"/campaignevent/read/${event.campaign.uuid}/${event.campaign_event\n .id}/\"\n >\n ${event.campaign_event.offset_display}\n ${event.campaign_event.relative_to.name}</span\n >\n </div>`;\n};\n\nexport const renderContactGroupsEvent = (\n event: ContactGroupsEvent\n): TemplateResult => {\n const groups = event.groups_added || event.groups_removed;\n const added = !!event.groups_added;\n return html`\n <temba-icon\n name=\"${Icon.users}\"\n class=\"${getClasses({ added: added, removed: !added })}\"\n ></temba-icon>\n <div class=\"description\">\n ${added ? 'Added to' : 'Removed from'}\n ${oxfordFn(\n groups,\n (group: ObjectReference) =>\n html`<span\n class=\"linked\"\n onclick=\"goto(event)\"\n href=\"/contact/filter/${group.uuid}\"\n >${group.name}</span\n >`\n )}\n ${event.type === Events.FAILURE\n ? html`<div>Run ended prematurely, check the flow design.</div>`\n : null}\n </div>\n `;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -305,24 +305,26 @@ export class ContactHistory extends RapidElement {
|
|
|
305
305
|
}
|
|
306
306
|
});
|
|
307
307
|
|
|
308
|
-
|
|
308
|
+
const fetchedEvents = results.events.reverse();
|
|
309
309
|
|
|
310
310
|
// dedupe any events we get from the server
|
|
311
311
|
// TODO: perhaps make this a little less crazy
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
312
|
+
let removed = 0;
|
|
313
|
+
this.eventGroups.forEach(g => {
|
|
314
|
+
const before = g.events.length;
|
|
315
|
+
g.events = g.events.filter(
|
|
316
|
+
prev =>
|
|
317
|
+
!fetchedEvents.find(fetched => {
|
|
318
|
+
return (
|
|
319
|
+
prev.created_on == fetched.created_on &&
|
|
320
|
+
prev.type === fetched.type
|
|
321
|
+
);
|
|
322
|
+
})
|
|
320
323
|
);
|
|
321
|
-
|
|
322
|
-
return !found;
|
|
324
|
+
removed += before - g.events.length;
|
|
323
325
|
});
|
|
324
326
|
|
|
325
|
-
this.lastRefreshAdded = fetchedEvents.length;
|
|
327
|
+
this.lastRefreshAdded = fetchedEvents.length - removed;
|
|
326
328
|
|
|
327
329
|
// reflow our most recent event group in case it merges with our new groups
|
|
328
330
|
const previousGroups = [...this.eventGroups];
|
package/src/contacts/events.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { css, html, TemplateResult } from 'lit';
|
|
1
|
+
import { css, EventPart, html, TemplateResult } from 'lit';
|
|
2
2
|
import { Msg, ObjectReference, User } from '../interfaces';
|
|
3
3
|
import {
|
|
4
4
|
getClasses,
|
|
@@ -212,6 +212,10 @@ export const getEventStyles = () => {
|
|
|
212
212
|
background: var(--color-automated) !important;
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
+
.queued {
|
|
216
|
+
opacity: 0.3;
|
|
217
|
+
}
|
|
218
|
+
|
|
215
219
|
.optin_requested {
|
|
216
220
|
--icon-color: var(--color-primary-dark);
|
|
217
221
|
}
|
|
@@ -823,6 +827,10 @@ export const renderMsgEvent = (
|
|
|
823
827
|
);
|
|
824
828
|
}
|
|
825
829
|
|
|
830
|
+
if (event.status === 'Q') {
|
|
831
|
+
summary.push(html`<div>Queued</div>`);
|
|
832
|
+
}
|
|
833
|
+
|
|
826
834
|
summary.push(
|
|
827
835
|
html`<temba-date
|
|
828
836
|
class="time"
|
|
@@ -831,7 +839,10 @@ export const renderMsgEvent = (
|
|
|
831
839
|
></temba-date>`
|
|
832
840
|
);
|
|
833
841
|
|
|
834
|
-
return html`<div
|
|
842
|
+
return html`<div
|
|
843
|
+
style="display:flex;align-items:flex-start"
|
|
844
|
+
class=${getClasses({ queued: event.status === 'Q' })}
|
|
845
|
+
>
|
|
835
846
|
<div style="display:flex;flex-direction:column">
|
|
836
847
|
<div
|
|
837
848
|
class="${event.msg.text ? '' : 'no-message'} attachments-${(
|
|
@@ -862,7 +873,9 @@ export const renderMsgEvent = (
|
|
|
862
873
|
|
|
863
874
|
<div
|
|
864
875
|
class="msg-summary"
|
|
865
|
-
style="flex-direction:row${isInbound
|
|
876
|
+
style="align-items:center;flex-direction:row${isInbound
|
|
877
|
+
? '-reverse'
|
|
878
|
+
: ''}"
|
|
866
879
|
>
|
|
867
880
|
<div style="flex-grow:1"></div>
|
|
868
881
|
${summary}
|