@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.
Files changed (91) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/a525ddb7.js +1 -0
  3. package/dist/index.js +1 -1
  4. package/dist/sw.js +1 -1
  5. package/dist/sw.js.map +1 -1
  6. package/dist/templates/components-body.html +1 -1
  7. package/dist/templates/components-head.html +1 -1
  8. package/out-tsc/src/button/Button.js +1 -0
  9. package/out-tsc/src/button/Button.js.map +1 -1
  10. package/out-tsc/src/contacts/ContactChat.js +81 -33
  11. package/out-tsc/src/contacts/ContactChat.js.map +1 -1
  12. package/out-tsc/src/contacts/ContactDetails.js +22 -22
  13. package/out-tsc/src/contacts/ContactDetails.js.map +1 -1
  14. package/out-tsc/src/contacts/ContactHistory.js +132 -139
  15. package/out-tsc/src/contacts/ContactHistory.js.map +1 -1
  16. package/out-tsc/src/contacts/events.js +110 -47
  17. package/out-tsc/src/contacts/events.js.map +1 -1
  18. package/out-tsc/src/interfaces.js.map +1 -1
  19. package/out-tsc/src/list/ContactList.js +32 -17
  20. package/out-tsc/src/list/ContactList.js.map +1 -1
  21. package/out-tsc/src/list/TembaList.js +10 -3
  22. package/out-tsc/src/list/TembaList.js.map +1 -1
  23. package/out-tsc/src/list/TembaMenu.js +7 -2
  24. package/out-tsc/src/list/TembaMenu.js.map +1 -1
  25. package/out-tsc/src/loading/Loading.js +9 -1
  26. package/out-tsc/src/loading/Loading.js.map +1 -1
  27. package/out-tsc/src/options/Options.js +14 -2
  28. package/out-tsc/src/options/Options.js.map +1 -1
  29. package/out-tsc/src/select/Select.js +23 -5
  30. package/out-tsc/src/select/Select.js.map +1 -1
  31. package/out-tsc/src/tip/Tip.js +6 -0
  32. package/out-tsc/src/tip/Tip.js.map +1 -1
  33. package/out-tsc/src/vectoricon/VectorIcon.js +17 -5
  34. package/out-tsc/src/vectoricon/VectorIcon.js.map +1 -1
  35. package/out-tsc/test/temba-contact-history.test.js +2 -2
  36. package/out-tsc/test/temba-contact-history.test.js.map +1 -1
  37. package/package.json +1 -1
  38. package/screenshots/truth/contacts/history-expanded.png +0 -0
  39. package/screenshots/truth/contacts/history.png +0 -0
  40. package/screenshots/truth/list/items-selected.png +0 -0
  41. package/screenshots/truth/list/items-updated.png +0 -0
  42. package/screenshots/truth/list/items.png +0 -0
  43. package/screenshots/truth/modax/simple.png +0 -0
  44. package/screenshots/truth/options/block.png +0 -0
  45. package/screenshots/truth/select/disabled-multi-selection.png +0 -0
  46. package/screenshots/truth/select/disabled-selection.png +0 -0
  47. package/screenshots/truth/select/disabled.png +0 -0
  48. package/screenshots/truth/select/embedded.png +0 -0
  49. package/screenshots/truth/select/expression-selected.png +0 -0
  50. package/screenshots/truth/select/expressions.png +0 -0
  51. package/screenshots/truth/select/functions.png +0 -0
  52. package/screenshots/truth/select/local-options.png +0 -0
  53. package/screenshots/truth/select/remote-options.png +0 -0
  54. package/screenshots/truth/select/search-enabled.png +0 -0
  55. package/screenshots/truth/select/search-multi-no-matches.png +0 -0
  56. package/screenshots/truth/select/search-selected-focus.png +0 -0
  57. package/screenshots/truth/select/search-selected.png +0 -0
  58. package/screenshots/truth/select/search-with-selected.png +0 -0
  59. package/screenshots/truth/select/searching.png +0 -0
  60. package/screenshots/truth/select/selected-multi.png +0 -0
  61. package/screenshots/truth/select/selected-single.png +0 -0
  62. package/screenshots/truth/select/with-placeholder.png +0 -0
  63. package/screenshots/truth/select/without-placeholder.png +0 -0
  64. package/screenshots/truth/textinput/date-form.png +0 -0
  65. package/screenshots/truth/textinput/input-disabled.png +0 -0
  66. package/screenshots/truth/textinput/input-form.png +0 -0
  67. package/screenshots/truth/textinput/input-placeholder.png +0 -0
  68. package/screenshots/truth/textinput/input-updated.png +0 -0
  69. package/screenshots/truth/textinput/input.png +0 -0
  70. package/screenshots/truth/textinput/textarea.png +0 -0
  71. package/screenshots/truth/tip/bottom.png +0 -0
  72. package/screenshots/truth/tip/left.png +0 -0
  73. package/screenshots/truth/tip/right.png +0 -0
  74. package/screenshots/truth/tip/top.png +0 -0
  75. package/src/button/Button.ts +1 -0
  76. package/src/contacts/ContactChat.ts +93 -33
  77. package/src/contacts/ContactDetails.ts +23 -23
  78. package/src/contacts/ContactHistory.ts +157 -160
  79. package/src/contacts/events.ts +117 -48
  80. package/src/interfaces.ts +3 -0
  81. package/src/list/ContactList.ts +39 -20
  82. package/src/list/TembaList.ts +13 -4
  83. package/src/list/TembaMenu.ts +7 -2
  84. package/src/loading/Loading.ts +8 -1
  85. package/src/options/Options.ts +14 -2
  86. package/src/select/Select.ts +28 -6
  87. package/src/tip/Tip.ts +6 -0
  88. package/src/vectoricon/VectorIcon.ts +17 -5
  89. package/test/temba-contact-history.test.ts +2 -2
  90. package/test-assets/style.css +4 -1
  91. 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(...arguments);
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 = `${url}&ticket=${this.ticket}`;
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
- while (stickyBin.childElementCount > 0) {
429
- stickyBin.removeChild(stickyBin.firstElementChild);
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
- if (this.currentTicket) {
617
- this.httpComplete = getAssets(`/api/v2/tickets.json?ticket=${this.currentTicket.uuid}`).then((assets) => {
618
- if (assets.length === 1) {
619
- const ticket = assets[0];
620
- if (ticket.assignee && ticket.assignee.id === agent) {
621
- this.fireCustomEvent(CustomEventType.ContentChanged, {
622
- ticket: { uuid: this.currentTicket.uuid, assigned: 'self' },
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="event ${event.type} ${isSticky ? 'has-sticky' : ''}"
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
- subject: ticket.subject,
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
- <div class="sticky-bin">${unfetchedTickets}</div>
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.tickets
696
- ? this.eventGroups.map((eventGroup, index) => {
697
- const grouping = getEventGroupType(eventGroup.events[0], this.ticket);
698
- const groupIndex = this.eventGroups.length - index - 1;
699
- const classes = getClasses({
700
- grouping: true,
701
- [grouping]: true,
702
- expanded: eventGroup.open,
703
- closing: eventGroup.closing,
704
- });
705
- return html `<div class="${classes}">
706
- ${grouping === 'verbose'
707
- ? html `<div
708
- class="event-count"
709
- @click=${this.handleEventGroupShow}
710
- data-group-index="${groupIndex}"
711
- >
712
- ${eventGroup.events.length}
713
- ${eventGroup.events.length === 1
714
- ? html `event`
715
- : html `events`}
716
- </div>`
717
- : null}
718
- ${grouping === 'verbose'
719
- ? html `
720
- <temba-icon
721
- @click=${this.handleEventGroupHide}
722
- data-group-index="${groupIndex}"
723
- class="grouping-close-button"
724
- name="x"
725
- clickable
726
- ></temba-icon>
727
- `
728
- : null}
729
- ${eventGroup.events.map((event) => {
730
- if (event.type === Events.TICKET_ASSIGNED &&
731
- event.note) {
732
- const noteEvent = { ...event };
733
- noteEvent.type = Events.TICKET_NOTE_ADDED;
734
- return html `${this.renderEventContainer(noteEvent)}${this.renderEventContainer(event)}`;
735
- }
736
- else {
737
- return this.renderEventContainer(event);
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