@nyaruka/temba-components 0.16.0 → 0.18.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 +29 -0
- package/dist/a525ddb7.js +1 -0
- package/dist/index.js +1 -1
- 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/button/Button.js +1 -0
- package/out-tsc/src/button/Button.js.map +1 -1
- package/out-tsc/src/contacts/ContactChat.js +81 -33
- package/out-tsc/src/contacts/ContactChat.js.map +1 -1
- package/out-tsc/src/contacts/ContactDetails.js +22 -22
- package/out-tsc/src/contacts/ContactDetails.js.map +1 -1
- package/out-tsc/src/contacts/ContactHistory.js +132 -139
- package/out-tsc/src/contacts/ContactHistory.js.map +1 -1
- package/out-tsc/src/contacts/events.js +110 -47
- package/out-tsc/src/contacts/events.js.map +1 -1
- package/out-tsc/src/interfaces.js.map +1 -1
- package/out-tsc/src/list/ContactList.js +32 -17
- package/out-tsc/src/list/ContactList.js.map +1 -1
- package/out-tsc/src/list/TembaList.js +10 -3
- package/out-tsc/src/list/TembaList.js.map +1 -1
- package/out-tsc/src/list/TembaMenu.js +7 -2
- package/out-tsc/src/list/TembaMenu.js.map +1 -1
- package/out-tsc/src/loading/Loading.js +9 -1
- package/out-tsc/src/loading/Loading.js.map +1 -1
- package/out-tsc/src/options/Options.js +14 -2
- package/out-tsc/src/options/Options.js.map +1 -1
- package/out-tsc/src/select/Select.js +23 -5
- package/out-tsc/src/select/Select.js.map +1 -1
- package/out-tsc/src/tip/Tip.js +6 -0
- package/out-tsc/src/tip/Tip.js.map +1 -1
- package/out-tsc/src/vectoricon/VectorIcon.js +17 -5
- package/out-tsc/src/vectoricon/VectorIcon.js.map +1 -1
- package/out-tsc/test/temba-contact-history.test.js +2 -2
- package/out-tsc/test/temba-contact-history.test.js.map +1 -1
- package/package.json +1 -1
- package/screenshots/truth/contacts/history-expanded.png +0 -0
- package/screenshots/truth/contacts/history.png +0 -0
- package/screenshots/truth/list/items-selected.png +0 -0
- package/screenshots/truth/list/items-updated.png +0 -0
- package/screenshots/truth/list/items.png +0 -0
- package/screenshots/truth/modax/simple.png +0 -0
- package/screenshots/truth/options/block.png +0 -0
- package/screenshots/truth/select/disabled-multi-selection.png +0 -0
- package/screenshots/truth/select/disabled-selection.png +0 -0
- package/screenshots/truth/select/disabled.png +0 -0
- package/screenshots/truth/select/embedded.png +0 -0
- package/screenshots/truth/select/expression-selected.png +0 -0
- package/screenshots/truth/select/expressions.png +0 -0
- package/screenshots/truth/select/functions.png +0 -0
- package/screenshots/truth/select/local-options.png +0 -0
- package/screenshots/truth/select/remote-options.png +0 -0
- package/screenshots/truth/select/search-enabled.png +0 -0
- package/screenshots/truth/select/search-multi-no-matches.png +0 -0
- package/screenshots/truth/select/search-selected-focus.png +0 -0
- package/screenshots/truth/select/search-selected.png +0 -0
- package/screenshots/truth/select/search-with-selected.png +0 -0
- package/screenshots/truth/select/searching.png +0 -0
- package/screenshots/truth/select/selected-multi.png +0 -0
- package/screenshots/truth/select/selected-single.png +0 -0
- package/screenshots/truth/select/with-placeholder.png +0 -0
- package/screenshots/truth/select/without-placeholder.png +0 -0
- package/screenshots/truth/textinput/date-form.png +0 -0
- package/screenshots/truth/textinput/input-disabled.png +0 -0
- package/screenshots/truth/textinput/input-form.png +0 -0
- package/screenshots/truth/textinput/input-placeholder.png +0 -0
- package/screenshots/truth/textinput/input-updated.png +0 -0
- package/screenshots/truth/textinput/input.png +0 -0
- package/screenshots/truth/textinput/textarea.png +0 -0
- package/screenshots/truth/tip/bottom.png +0 -0
- package/screenshots/truth/tip/left.png +0 -0
- package/screenshots/truth/tip/right.png +0 -0
- package/screenshots/truth/tip/top.png +0 -0
- package/src/button/Button.ts +1 -0
- package/src/contacts/ContactChat.ts +93 -33
- package/src/contacts/ContactDetails.ts +23 -23
- package/src/contacts/ContactHistory.ts +157 -160
- package/src/contacts/events.ts +117 -48
- package/src/interfaces.ts +3 -0
- package/src/list/ContactList.ts +39 -20
- package/src/list/TembaList.ts +13 -4
- package/src/list/TembaMenu.ts +7 -2
- package/src/loading/Loading.ts +8 -1
- package/src/options/Options.ts +14 -2
- package/src/select/Select.ts +28 -6
- package/src/tip/Tip.ts +6 -0
- package/src/vectoricon/VectorIcon.ts +17 -5
- package/test/temba-contact-history.test.ts +2 -2
- package/test-assets/style.css +4 -1
- package/dist/228cf25e.js +0 -1
|
@@ -5,12 +5,24 @@ import { html } from 'lit-html';
|
|
|
5
5
|
import { CustomEventType } from '../interfaces';
|
|
6
6
|
import { RapidElement } from '../RapidElement';
|
|
7
7
|
import { getAssets, getClasses, postJSON, throttle } from '../utils';
|
|
8
|
-
import ResizeObserver from 'resize-observer-polyfill';
|
|
9
8
|
import { Events, getEventGroupType, getEventStyles, renderAirtimeTransferredEvent, renderCallStartedEvent, renderCampaignFiredEvent, renderChannelEvent, renderContactGroupsEvent, renderContactLanguageChangedEvent, renderContactURNsChanged, renderEmailSent, renderErrorMessage, renderFlowEvent, renderLabelsAdded, renderMsgEvent, renderNameChanged, renderNoteCreated, renderResultEvent, renderTicketAction, renderTicketAssigned, renderTicketOpened, renderUpdateEvent, renderWebhookEvent, } from './events';
|
|
10
9
|
import { fetchContactHistory, MAX_CHAT_REFRESH, MIN_CHAT_REFRESH, SCROLL_THRESHOLD, } from './helpers';
|
|
10
|
+
// when images load, make sure we are on the bottom of the scroll window if necessary
|
|
11
|
+
export const loadHandler = function (event) {
|
|
12
|
+
const target = event.target;
|
|
13
|
+
const events = this.host.getEventsPane();
|
|
14
|
+
if (target.tagName == 'IMG') {
|
|
15
|
+
if (!this.host.showMessageAlert) {
|
|
16
|
+
if (events.scrollTop > target.offsetTop - 1000 &&
|
|
17
|
+
target.offsetTop > events.scrollHeight - 500) {
|
|
18
|
+
this.host.scrollToBottom();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
11
23
|
export class ContactHistory extends RapidElement {
|
|
12
24
|
constructor() {
|
|
13
|
-
super(
|
|
25
|
+
super();
|
|
14
26
|
this.getStickyId = (event) => {
|
|
15
27
|
if (event.type === Events.TICKET_OPENED) {
|
|
16
28
|
const ticket = this.getTicketForEvent(event);
|
|
@@ -28,12 +40,19 @@ export class ContactHistory extends RapidElement {
|
|
|
28
40
|
this.ticket = null;
|
|
29
41
|
this.endDate = null;
|
|
30
42
|
this.tickets = null;
|
|
31
|
-
this.currentTicket = null;
|
|
32
43
|
this.ticketEvents = {};
|
|
33
44
|
this.lastHeight = 0;
|
|
34
45
|
this.refreshTimeout = null;
|
|
35
46
|
this.empty = false;
|
|
36
47
|
}
|
|
48
|
+
connectedCallback() {
|
|
49
|
+
super.connectedCallback();
|
|
50
|
+
this.shadowRoot.addEventListener('load', loadHandler, true);
|
|
51
|
+
}
|
|
52
|
+
disconnectedCallback() {
|
|
53
|
+
super.disconnectedCallback();
|
|
54
|
+
this.shadowRoot.removeEventListener('load', loadHandler, true);
|
|
55
|
+
}
|
|
37
56
|
getTicketForEvent(event) {
|
|
38
57
|
return this.getTicket(event.ticket.uuid);
|
|
39
58
|
}
|
|
@@ -59,6 +78,7 @@ export class ContactHistory extends RapidElement {
|
|
|
59
78
|
flex-grow: 1;
|
|
60
79
|
border-top-left-radius: var(--curvature);
|
|
61
80
|
padding-top: 1em;
|
|
81
|
+
background: #fff;
|
|
62
82
|
}
|
|
63
83
|
|
|
64
84
|
temba-loading {
|
|
@@ -99,15 +119,27 @@ export class ContactHistory extends RapidElement {
|
|
|
99
119
|
pointer: cursor;
|
|
100
120
|
}
|
|
101
121
|
|
|
122
|
+
.scroll-title {
|
|
123
|
+
display: flex;
|
|
124
|
+
flex-direction: column;
|
|
125
|
+
z-index: 2;
|
|
126
|
+
border-top-left-radius: var(--curvature);
|
|
127
|
+
overflow: hidden;
|
|
128
|
+
box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.15);
|
|
129
|
+
background: rgb(240, 240, 240);
|
|
130
|
+
padding: 1em 1.2em;
|
|
131
|
+
font-size: 1.2em;
|
|
132
|
+
font-weight: 400;
|
|
133
|
+
}
|
|
134
|
+
|
|
102
135
|
.sticky-bin {
|
|
103
136
|
display: flex;
|
|
104
137
|
flex-direction: column;
|
|
105
|
-
position: fixed;
|
|
106
138
|
z-index: 2;
|
|
107
139
|
border-top-left-radius: var(--curvature);
|
|
108
140
|
overflow: hidden;
|
|
109
|
-
background: rgba(240, 240, 240, 0.95);
|
|
110
141
|
box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.15);
|
|
142
|
+
background: rgb(240, 240, 240);
|
|
111
143
|
}
|
|
112
144
|
|
|
113
145
|
.sticky-bin temba-icon {
|
|
@@ -149,28 +181,18 @@ export class ContactHistory extends RapidElement {
|
|
|
149
181
|
firstUpdated(changedProperties) {
|
|
150
182
|
super.firstUpdated(changedProperties);
|
|
151
183
|
this.handleClose = this.handleClose.bind(this);
|
|
152
|
-
const stickyBin = this.getDiv('.sticky-bin');
|
|
153
|
-
const resizer = new ResizeObserver(entries => {
|
|
154
|
-
for (const entry of entries) {
|
|
155
|
-
const eventContainer = entry.contentRect;
|
|
156
|
-
stickyBin.style.width =
|
|
157
|
-
eventContainer.width + eventContainer.left - 16 + 'px';
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
resizer.observe(this);
|
|
161
184
|
}
|
|
162
185
|
updated(changedProperties) {
|
|
163
186
|
super.updated(changedProperties);
|
|
164
|
-
// fire an event when our current ticket changes
|
|
165
|
-
if (changedProperties.has('currentTicket')) {
|
|
166
|
-
this.fireCustomEvent(CustomEventType.ContextChanged, {
|
|
167
|
-
context: this.currentTicket,
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
187
|
// fire an event if we get a new event
|
|
171
188
|
if (changedProperties.has('mostRecentEvent')) {
|
|
172
189
|
this.fireCustomEvent(CustomEventType.Refreshed);
|
|
173
190
|
}
|
|
191
|
+
if (changedProperties.has('endDate')) {
|
|
192
|
+
if (this.refreshTimeout && this.endDate) {
|
|
193
|
+
window.clearTimeout(this.refreshTimeout);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
174
196
|
// if we don't have an endpoint infer one
|
|
175
197
|
if (changedProperties.has('uuid')) {
|
|
176
198
|
if (this.uuid == null) {
|
|
@@ -195,7 +217,8 @@ export class ContactHistory extends RapidElement {
|
|
|
195
217
|
}
|
|
196
218
|
if (changedProperties.has('refreshing') &&
|
|
197
219
|
this.refreshing &&
|
|
198
|
-
this.endpoint
|
|
220
|
+
this.endpoint &&
|
|
221
|
+
!this.endDate) {
|
|
199
222
|
const after = (this.getLastEventTime() - 1) * 1000;
|
|
200
223
|
let forceOpen = false;
|
|
201
224
|
fetchContactHistory(false, this.endpoint, this.ticket, null, after)
|
|
@@ -334,25 +357,18 @@ export class ContactHistory extends RapidElement {
|
|
|
334
357
|
stickyBin.removeChild(child);
|
|
335
358
|
}
|
|
336
359
|
}
|
|
337
|
-
if (!this.currentTicket) {
|
|
338
|
-
this.updateCurrentTicket();
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
updateCurrentTicket() {
|
|
343
|
-
const openTickets = (this.tickets || []).filter(ticket => ticket && ticket.status === 'open');
|
|
344
|
-
if (openTickets.length > 0) {
|
|
345
|
-
this.currentTicket = openTickets[openTickets.length - 1];
|
|
346
360
|
}
|
|
347
361
|
}
|
|
348
362
|
refreshTickets() {
|
|
349
|
-
let url = `/api/v2/tickets.json?contact=${this.uuid}`;
|
|
350
363
|
if (this.ticket) {
|
|
351
|
-
url =
|
|
364
|
+
let url = `/api/v2/tickets.json?contact=${this.uuid}`;
|
|
365
|
+
if (this.ticket) {
|
|
366
|
+
url = `${url}&ticket=${this.ticket}`;
|
|
367
|
+
}
|
|
368
|
+
getAssets(url).then((tickets) => {
|
|
369
|
+
this.tickets = tickets.reverse();
|
|
370
|
+
});
|
|
352
371
|
}
|
|
353
|
-
getAssets(url).then((tickets) => {
|
|
354
|
-
this.tickets = tickets.reverse();
|
|
355
|
-
});
|
|
356
372
|
}
|
|
357
373
|
getEventsPane() {
|
|
358
374
|
return this.getDiv('.events');
|
|
@@ -403,6 +419,9 @@ export class ContactHistory extends RapidElement {
|
|
|
403
419
|
return grouped;
|
|
404
420
|
}
|
|
405
421
|
scheduleRefresh(wait = -1) {
|
|
422
|
+
if (this.endDate) {
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
406
425
|
let refreshWait = wait;
|
|
407
426
|
if (wait === -1) {
|
|
408
427
|
const lastEventTime = this.getLastEventTime();
|
|
@@ -425,10 +444,11 @@ export class ContactHistory extends RapidElement {
|
|
|
425
444
|
reset() {
|
|
426
445
|
// clear out our sticky bin which we manipulated manually
|
|
427
446
|
const stickyBin = this.getDiv('.sticky-bin');
|
|
428
|
-
|
|
429
|
-
|
|
447
|
+
if (stickyBin) {
|
|
448
|
+
while (stickyBin.childElementCount > 0) {
|
|
449
|
+
stickyBin.removeChild(stickyBin.firstElementChild);
|
|
450
|
+
}
|
|
430
451
|
}
|
|
431
|
-
this.currentTicket = null;
|
|
432
452
|
this.endpoint = null;
|
|
433
453
|
this.tickets = null;
|
|
434
454
|
this.ticketEvents = {};
|
|
@@ -474,14 +494,6 @@ export class ContactHistory extends RapidElement {
|
|
|
474
494
|
sticky.classList.add('pinned');
|
|
475
495
|
sticky.eventElement = eventElement;
|
|
476
496
|
stickyBin.appendChild(eventElement);
|
|
477
|
-
const uuid = eventElement.getAttribute('data-sticky-id');
|
|
478
|
-
const ticket = this.getTicket(uuid);
|
|
479
|
-
if (ticket) {
|
|
480
|
-
if (!this.currentTicket ||
|
|
481
|
-
this.currentTicket.uuid !== ticket.uuid) {
|
|
482
|
-
this.currentTicket = ticket;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
497
|
}
|
|
486
498
|
}
|
|
487
499
|
else {
|
|
@@ -489,24 +501,6 @@ export class ContactHistory extends RapidElement {
|
|
|
489
501
|
if (scrollBoundary < sticky.offsetTop + sticky.offsetHeight) {
|
|
490
502
|
sticky.appendChild(eventElement);
|
|
491
503
|
sticky.classList.remove('pinned');
|
|
492
|
-
const uuid = eventElement.getAttribute('data-sticky-id');
|
|
493
|
-
let previousTicket = null;
|
|
494
|
-
for (const ticket of this.tickets) {
|
|
495
|
-
if (ticket.uuid === uuid) {
|
|
496
|
-
break;
|
|
497
|
-
}
|
|
498
|
-
previousTicket = ticket;
|
|
499
|
-
}
|
|
500
|
-
if (previousTicket &&
|
|
501
|
-
(!this.currentTicket ||
|
|
502
|
-
this.currentTicket.uuid !== previousTicket.uuid)) {
|
|
503
|
-
if (previousTicket.status === 'open') {
|
|
504
|
-
this.currentTicket = previousTicket;
|
|
505
|
-
}
|
|
506
|
-
else {
|
|
507
|
-
this.currentTicket = null;
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
504
|
}
|
|
511
505
|
}
|
|
512
506
|
});
|
|
@@ -561,17 +555,17 @@ export class ContactHistory extends RapidElement {
|
|
|
561
555
|
if (activeTicket && ticket && ticket.status === 'open') {
|
|
562
556
|
closeHandler = this.handleClose;
|
|
563
557
|
}
|
|
564
|
-
return renderTicketOpened(ticketEvent, closeHandler);
|
|
558
|
+
return renderTicketOpened(ticketEvent, closeHandler, !this.ticket);
|
|
565
559
|
}
|
|
566
560
|
case Events.TICKET_NOTE_ADDED:
|
|
567
561
|
return renderNoteCreated(event, this.agent);
|
|
568
562
|
case Events.TICKET_ASSIGNED:
|
|
569
563
|
return renderTicketAssigned(event);
|
|
570
564
|
case Events.TICKET_REOPENED: {
|
|
571
|
-
return renderTicketAction(event, 'reopened');
|
|
565
|
+
return renderTicketAction(event, 'reopened', !this.ticket);
|
|
572
566
|
}
|
|
573
567
|
case Events.TICKET_CLOSED:
|
|
574
|
-
return renderTicketAction(event, 'closed');
|
|
568
|
+
return renderTicketAction(event, 'closed', !this.ticket);
|
|
575
569
|
case Events.ERROR:
|
|
576
570
|
case Events.FAILURE:
|
|
577
571
|
return renderErrorMessage(event);
|
|
@@ -606,30 +600,27 @@ export class ContactHistory extends RapidElement {
|
|
|
606
600
|
this.fireCustomEvent(CustomEventType.ContentChanged, {
|
|
607
601
|
ticket: { uuid, status: 'closed' },
|
|
608
602
|
});
|
|
609
|
-
this.updateCurrentTicket();
|
|
610
603
|
})
|
|
611
604
|
.catch((response) => {
|
|
612
605
|
console.error(response);
|
|
613
606
|
});
|
|
614
607
|
}
|
|
615
608
|
checkForAgentAssignmentEvent(agent) {
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
this.
|
|
622
|
-
|
|
623
|
-
});
|
|
624
|
-
}
|
|
625
|
-
else {
|
|
626
|
-
this.fireCustomEvent(CustomEventType.ContentChanged, {
|
|
627
|
-
ticket: { uuid: this.currentTicket.uuid, assigned: 'other' },
|
|
628
|
-
});
|
|
629
|
-
}
|
|
609
|
+
this.httpComplete = getAssets(`/api/v2/tickets.json?ticket=${this.ticket}`).then((assets) => {
|
|
610
|
+
if (assets.length === 1) {
|
|
611
|
+
const ticket = assets[0];
|
|
612
|
+
if (ticket.assignee && ticket.assignee.id === agent) {
|
|
613
|
+
this.fireCustomEvent(CustomEventType.ContentChanged, {
|
|
614
|
+
ticket: { uuid: this.ticket, assigned: 'self' },
|
|
615
|
+
});
|
|
630
616
|
}
|
|
631
|
-
|
|
632
|
-
|
|
617
|
+
else {
|
|
618
|
+
this.fireCustomEvent(CustomEventType.ContentChanged, {
|
|
619
|
+
ticket: { uuid: this.ticket, assigned: 'other' },
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
});
|
|
633
624
|
}
|
|
634
625
|
getEventHandlers() {
|
|
635
626
|
return [
|
|
@@ -648,7 +639,9 @@ export class ContactHistory extends RapidElement {
|
|
|
648
639
|
const isSticky = !!stickyId;
|
|
649
640
|
const renderedEvent = html `
|
|
650
641
|
<div
|
|
651
|
-
class="
|
|
642
|
+
class="${this.ticket
|
|
643
|
+
? 'active-ticket'
|
|
644
|
+
: ''} event ${event.type} ${isSticky ? 'has-sticky' : ''}"
|
|
652
645
|
data-sticky-id="${stickyId}"
|
|
653
646
|
>
|
|
654
647
|
${this.renderEvent(event)}
|
|
@@ -671,14 +664,14 @@ export class ContactHistory extends RapidElement {
|
|
|
671
664
|
type: Events.TICKET_OPENED,
|
|
672
665
|
ticket: {
|
|
673
666
|
uuid: ticket.uuid,
|
|
674
|
-
|
|
667
|
+
topic: ticket.topic,
|
|
675
668
|
body: ticket.body,
|
|
676
669
|
ticketer: ticket.ticketer,
|
|
677
670
|
},
|
|
678
671
|
// eslint-disable-next-line @typescript-eslint/camelcase
|
|
679
672
|
created_on: ticket.opened_on,
|
|
680
673
|
};
|
|
681
|
-
const renderedEvent = renderTicketOpened(ticketOpenedEvent, this.handleClose);
|
|
674
|
+
const renderedEvent = renderTicketOpened(ticketOpenedEvent, this.handleClose, !this.ticket);
|
|
682
675
|
return html `<div class="event ticket_opened">
|
|
683
676
|
${renderedEvent}
|
|
684
677
|
</div>`;
|
|
@@ -687,59 +680,59 @@ export class ContactHistory extends RapidElement {
|
|
|
687
680
|
})
|
|
688
681
|
: null;
|
|
689
682
|
return html `
|
|
690
|
-
|
|
683
|
+
${this.ticket
|
|
684
|
+
? html `<div class="sticky-bin">${unfetchedTickets}</div>`
|
|
685
|
+
: this.contact
|
|
686
|
+
? html `<div class="scroll-title">${this.contact.name}</div>`
|
|
687
|
+
: null}
|
|
691
688
|
${this.fetching
|
|
692
689
|
? html `<temba-loading units="5" size="10"></temba-loading>`
|
|
693
690
|
: html `<div style="height:0em"></div>`}
|
|
694
691
|
<div class="events" @scroll=${this.handleScroll}>
|
|
695
|
-
${this.
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
})}
|
|
740
|
-
</div>`;
|
|
741
|
-
})
|
|
742
|
-
: null}
|
|
692
|
+
${this.eventGroups.map((eventGroup, index) => {
|
|
693
|
+
const grouping = getEventGroupType(eventGroup.events[0], this.ticket);
|
|
694
|
+
const groupIndex = this.eventGroups.length - index - 1;
|
|
695
|
+
const classes = getClasses({
|
|
696
|
+
grouping: true,
|
|
697
|
+
[grouping]: true,
|
|
698
|
+
expanded: eventGroup.open,
|
|
699
|
+
closing: eventGroup.closing,
|
|
700
|
+
});
|
|
701
|
+
return html `<div class="${classes}">
|
|
702
|
+
${grouping === 'verbose'
|
|
703
|
+
? html `<div
|
|
704
|
+
class="event-count"
|
|
705
|
+
@click=${this.handleEventGroupShow}
|
|
706
|
+
data-group-index="${groupIndex}"
|
|
707
|
+
>
|
|
708
|
+
${eventGroup.events.length}
|
|
709
|
+
${eventGroup.events.length === 1 ? html `event` : html `events`}
|
|
710
|
+
</div>`
|
|
711
|
+
: null}
|
|
712
|
+
${grouping === 'verbose'
|
|
713
|
+
? html `
|
|
714
|
+
<temba-icon
|
|
715
|
+
@click=${this.handleEventGroupHide}
|
|
716
|
+
data-group-index="${groupIndex}"
|
|
717
|
+
class="grouping-close-button"
|
|
718
|
+
name="x"
|
|
719
|
+
clickable
|
|
720
|
+
></temba-icon>
|
|
721
|
+
`
|
|
722
|
+
: null}
|
|
723
|
+
${eventGroup.events.map((event) => {
|
|
724
|
+
if (event.type === Events.TICKET_ASSIGNED &&
|
|
725
|
+
event.note) {
|
|
726
|
+
const noteEvent = { ...event };
|
|
727
|
+
noteEvent.type = Events.TICKET_NOTE_ADDED;
|
|
728
|
+
return html `${this.renderEventContainer(noteEvent)}${this.renderEventContainer(event)}`;
|
|
729
|
+
}
|
|
730
|
+
else {
|
|
731
|
+
return this.renderEventContainer(event);
|
|
732
|
+
}
|
|
733
|
+
})}
|
|
734
|
+
</div>`;
|
|
735
|
+
})}
|
|
743
736
|
</div>
|
|
744
737
|
|
|
745
738
|
<div class="new-messages-container">
|
|
@@ -757,6 +750,9 @@ export class ContactHistory extends RapidElement {
|
|
|
757
750
|
`;
|
|
758
751
|
}
|
|
759
752
|
}
|
|
753
|
+
__decorate([
|
|
754
|
+
property({ type: Object })
|
|
755
|
+
], ContactHistory.prototype, "contact", void 0);
|
|
760
756
|
__decorate([
|
|
761
757
|
property({ type: String })
|
|
762
758
|
], ContactHistory.prototype, "uuid", void 0);
|
|
@@ -796,7 +792,4 @@ __decorate([
|
|
|
796
792
|
__decorate([
|
|
797
793
|
property({ type: Array })
|
|
798
794
|
], ContactHistory.prototype, "tickets", void 0);
|
|
799
|
-
__decorate([
|
|
800
|
-
property({ type: Object })
|
|
801
|
-
], ContactHistory.prototype, "currentTicket", void 0);
|
|
802
795
|
//# sourceMappingURL=ContactHistory.js.map
|