@nyaruka/temba-components 0.108.7 → 0.109.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 +19 -2
- package/dist/static/svg/index.svg +1 -1
- package/dist/temba-components.js +602 -455
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/charcount/CharCount.js +4 -5
- package/out-tsc/src/charcount/CharCount.js.map +1 -1
- package/out-tsc/src/completion/Completion.js +27 -16
- package/out-tsc/src/completion/Completion.js.map +1 -1
- package/out-tsc/src/compose/Compose.js +259 -95
- package/out-tsc/src/compose/Compose.js.map +1 -1
- package/out-tsc/src/contacts/ContactChat.js +18 -16
- package/out-tsc/src/contacts/ContactChat.js.map +1 -1
- package/out-tsc/src/contacts/ContactTickets.js +1 -1
- package/out-tsc/src/contacts/ContactTickets.js.map +1 -1
- package/out-tsc/src/interfaces.js.map +1 -1
- package/out-tsc/src/list/ShortcutList.js +125 -0
- package/out-tsc/src/list/ShortcutList.js.map +1 -0
- package/out-tsc/src/list/TembaList.js +8 -5
- package/out-tsc/src/list/TembaList.js.map +1 -1
- package/out-tsc/src/options/Options.js +46 -35
- package/out-tsc/src/options/Options.js.map +1 -1
- package/out-tsc/src/select/Select.js +1 -1
- package/out-tsc/src/select/Select.js.map +1 -1
- package/out-tsc/src/store/Store.js +18 -3
- package/out-tsc/src/store/Store.js.map +1 -1
- package/out-tsc/src/tabpane/Tab.js +2 -0
- package/out-tsc/src/tabpane/Tab.js.map +1 -1
- package/out-tsc/src/tabpane/TabPane.js +27 -5
- package/out-tsc/src/tabpane/TabPane.js.map +1 -1
- package/out-tsc/src/textinput/TextInput.js +7 -2
- package/out-tsc/src/textinput/TextInput.js.map +1 -1
- package/out-tsc/src/utils/index.js.map +1 -1
- package/out-tsc/src/vectoricon/index.js +2 -2
- package/out-tsc/src/vectoricon/index.js.map +1 -1
- package/out-tsc/temba-modules.js +2 -0
- package/out-tsc/temba-modules.js.map +1 -1
- package/out-tsc/test/temba-compose.test.js +26 -18
- package/out-tsc/test/temba-compose.test.js.map +1 -1
- package/out-tsc/test/temba-contact-chat.test.js +27 -18
- package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
- package/package.json +1 -1
- package/screenshots/truth/compose/attachments-and-send-button.png +0 -0
- package/screenshots/truth/compose/attachments-no-send-button.png +0 -0
- package/screenshots/truth/compose/attachments-with-all-files-and-click-send.png +0 -0
- package/screenshots/truth/compose/attachments-with-all-files.png +0 -0
- package/screenshots/truth/compose/attachments-with-failure-files.png +0 -0
- package/screenshots/truth/compose/attachments-with-success-files-and-click-send.png +0 -0
- package/screenshots/truth/compose/attachments-with-success-files.png +0 -0
- package/screenshots/truth/compose/chatbox-attachments-counter-and-send-button.png +0 -0
- package/screenshots/truth/compose/chatbox-attachments-counter-no-send-button.png +0 -0
- package/screenshots/truth/compose/chatbox-attachments-no-counter-and-send-button.png +0 -0
- package/screenshots/truth/compose/chatbox-attachments-no-counter-no-send-button.png +0 -0
- package/screenshots/truth/compose/chatbox-counter-and-send-button.png +0 -0
- package/screenshots/truth/compose/chatbox-counter-no-send-button.png +0 -0
- package/screenshots/truth/compose/chatbox-no-counter-and-send-button.png +0 -0
- package/screenshots/truth/compose/chatbox-no-counter-no-send-button.png +0 -0
- package/screenshots/truth/compose/chatbox-no-text-attachments-with-all-files-and-click-send.png +0 -0
- package/screenshots/truth/compose/chatbox-no-text-attachments-with-all-files.png +0 -0
- package/screenshots/truth/compose/chatbox-no-text-attachments-with-failure-files.png +0 -0
- package/screenshots/truth/compose/chatbox-no-text-attachments-with-success-files-and-click-send.png +0 -0
- package/screenshots/truth/compose/chatbox-no-text-attachments-with-success-files.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-and-click-send.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-and-hit-enter.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-and-spaces.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-and-url.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-attachments-no-files-and-click-send.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-attachments-no-files-and-hit-enter.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-attachments-no-files.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-attachments-with-all-files-and-click-send.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-attachments-with-all-files-and-hit-enter.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-attachments-with-all-files.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-attachments-with-failure-files.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-attachments-with-success-files-and-click-send.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-attachments-with-success-files-and-hit-enter.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-attachments-with-success-files.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text-no-spaces.png +0 -0
- package/screenshots/truth/compose/chatbox-with-text.png +0 -0
- package/screenshots/truth/contacts/compose-attachments-no-text-failure.png +0 -0
- package/screenshots/truth/contacts/compose-attachments-no-text-success.png +0 -0
- package/screenshots/truth/contacts/compose-text-and-attachments-failure-attachments.png +0 -0
- package/screenshots/truth/contacts/compose-text-and-attachments-failure-generic.png +0 -0
- package/screenshots/truth/contacts/compose-text-and-attachments-failure-text-and-attachments.png +0 -0
- package/screenshots/truth/contacts/compose-text-and-attachments-failure-text.png +0 -0
- package/screenshots/truth/contacts/compose-text-and-attachments-success.png +0 -0
- package/screenshots/truth/contacts/compose-text-no-attachments-failure.png +0 -0
- package/screenshots/truth/contacts/compose-text-no-attachments-success.png +0 -0
- package/screenshots/truth/contacts/contact-active-default.png +0 -0
- package/screenshots/truth/contacts/contact-active-show-chatbox.png +0 -0
- package/screenshots/truth/counter/summary.png +0 -0
- package/screenshots/truth/counter/text.png +0 -0
- package/screenshots/truth/counter/unicode-variables.png +0 -0
- package/screenshots/truth/counter/unicode.png +0 -0
- package/screenshots/truth/counter/variable.png +0 -0
- package/src/charcount/CharCount.ts +4 -5
- package/src/completion/Completion.ts +33 -19
- package/src/compose/Compose.ts +289 -96
- package/src/contacts/ContactChat.ts +18 -16
- package/src/contacts/ContactTickets.ts +1 -1
- package/src/interfaces.ts +7 -0
- package/src/list/ShortcutList.ts +137 -0
- package/src/list/TembaList.ts +9 -6
- package/src/options/Options.ts +53 -44
- package/src/select/Select.ts +1 -1
- package/src/store/Store.ts +23 -4
- package/src/tabpane/Tab.ts +2 -0
- package/src/tabpane/TabPane.ts +28 -5
- package/src/textinput/TextInput.ts +9 -3
- package/src/utils/index.ts +8 -2
- package/src/vectoricon/index.ts +2 -2
- package/static/svg/index.svg +1 -1
- package/static/svg/work/traced/zap-fast.svg +1 -0
- package/static/svg/work/used/zap-fast.svg +3 -0
- package/temba-modules.ts +2 -0
- package/test/temba-compose.test.ts +28 -35
- package/test/temba-contact-chat.test.ts +28 -37
- package/test-assets/store/shortcuts.json +14 -0
- package/static/svg/work/traced/message-dots-circle.svg +0 -1
- package/static/svg/work/used/message-dots-circle.svg +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Compose.js","sourceRoot":"","sources":["../../../src/compose/Compose.ts"],"names":[],"mappings":"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","sourcesContent":["import { TemplateResult, html, css } from 'lit';\nimport { FormElement } from '../FormElement';\nimport { property } from 'lit/decorators.js';\nimport { Attachment, CustomEventType, Language } from '../interfaces';\nimport { DEFAULT_MEDIA_ENDPOINT, getClasses } from '../utils';\nimport { Completion } from '../completion/Completion';\nimport { Select } from '../select/Select';\nimport { TabPane } from '../tabpane/TabPane';\nimport { MediaPicker } from '../mediapicker/MediaPicker';\nimport { Tab } from '../tabpane/Tab';\n\nexport class Compose extends FormElement {\n static get styles() {\n return css`\n :host {\n --textarea-min-height: var(--textarea-min-height, 4em);\n overflow: hidden;\n border-top-right-radius: var(--curvature);\n border-top-left-radius: var(--curvature);\n }\n\n .active-template .chatbox {\n display: none;\n }\n\n .active-template .actions {\n border: none;\n }\n\n .container {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n position: relative;\n\n border-radius: var(--curvature-widget);\n background: var(--color-widget-bg);\n border: var(--compose-border, 1px solid var(--color-widget-border));\n transition: all ease-in-out var(--transition-speed);\n box-shadow: var(--compose-shadow, var(--widget-box-shadow));\n caret-color: var(--input-caret);\n }\n\n .chatbox {\n --color-widget-border: none;\n --curvature-widget: var(\n --compose-curvature,\n var(--curvature) var(--curvature) 0px 0px\n );\n\n --widget-box-shadow: none;\n padding: var(--compose-padding, 0px);\n }\n\n .actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0em;\n background: #f9f9f9;\n border-bottom-left-radius: var(--curvature);\n border-bottom-right-radius: var(--curvature);\n border-top: solid 1px var(--color-widget-border);\n }\n\n .actions-right {\n display: flex;\n align-items: center;\n }\n\n temba-charcount {\n margin-right: 5px;\n overflow: hidden;\n --temba-charcount-counts-margin-top: 0px;\n --temba-charcount-summary-margin-top: 0px;\n --temba-charcount-summary-position: fixed;\n --temba-charcount-summary-right: 105px;\n --temba-charcount-summary-bottom: 105px;\n }\n\n temba-button {\n --button-y: 1px;\n --button-x: 12px;\n }\n\n .send-error {\n color: rgba(250, 0, 0, 0.75);\n font-size: var(--help-text-size);\n }\n\n .language {\n margin-bottom: 0.6em;\n display: block;\n }\n\n .top-right {\n align-items: center;\n display: flex;\n }\n\n #send-button {\n margin: 0.3em;\n }\n\n temba-tabs {\n --focused-tab-color: #f4f4f4;\n }\n\n .quick-replies {\n margin: 0.8em;\n }\n\n .optins {\n padding: 1em;\n }\n\n .attachments {\n }\n\n temba-template-editor {\n padding: 1em;\n }\n `;\n }\n\n @property({ type: Number })\n index = 1;\n\n @property({ type: Number })\n maxAttachments = 3;\n\n @property({ type: Number })\n maxLength = 640;\n\n @property({ type: Boolean })\n completion: boolean;\n\n @property({ type: Boolean })\n chatbox: boolean;\n\n @property({ type: Boolean })\n attachments: boolean;\n\n @property({ type: Boolean })\n quickReplies: boolean;\n\n @property({ type: Boolean })\n optIns: boolean;\n\n @property({ type: Boolean })\n templates: boolean;\n\n @property({ type: Boolean })\n counter: boolean;\n\n @property({ type: Boolean })\n button: boolean;\n\n @property({ type: Boolean })\n autogrow: boolean;\n\n @property({ type: String })\n currentText = '';\n\n @property({ type: String })\n initialText = '';\n\n @property({ type: String })\n accept = ''; //e.g. \".xls,.xlsx\"\n\n @property({ type: String, attribute: false })\n endpoint = DEFAULT_MEDIA_ENDPOINT;\n\n @property({ type: Boolean, attribute: false })\n uploading: boolean;\n\n @property({ type: Array })\n languages: Language[] = [];\n\n @property({ type: Array })\n currentAttachments: Attachment[] = [];\n\n @property({ type: Array })\n currentQuickReplies: { name: string; value: string }[] = [];\n\n @property({ type: Array })\n currentOptin: { name: string; uuid: string }[] = [];\n\n @property({ type: Array })\n variables: string[] = [];\n\n @property({ type: String })\n template: string;\n\n @property({ type: Object })\n currentTemplate: { name: string; uuid: string };\n\n // locale for the template\n @property({ type: String })\n locale: string;\n\n @property({ type: String })\n optinEndpoint = '/api/v2/optins.json';\n\n @property({ type: String })\n templateEndpoint = '/api/internal/templates.json';\n\n @property({ type: String })\n buttonName = 'Send';\n\n @property({ type: Boolean, attribute: false })\n buttonDisabled = true;\n\n @property({ type: String, attribute: false })\n buttonError = '';\n\n @property({ type: Boolean, attribute: 'widget_only' })\n widgetOnly: boolean;\n\n @property({ type: Array })\n errors: string[];\n\n @property({ type: Object })\n langValues: {\n [lang: string]: {\n text: string;\n attachments: Attachment[];\n quick_replies: string[];\n optin?: { name: string; uuid: string };\n template?: string;\n variables?: string[];\n locale?: string;\n };\n } = {};\n\n @property({ type: String })\n currentLanguage = 'und';\n\n @property({ type: Object })\n currentTab: Tab;\n\n public constructor() {\n super();\n }\n\n private isBaseLanguage(): boolean {\n return (\n this.currentLanguage == 'und' ||\n this.currentLanguage == this.languages[0].iso\n );\n }\n\n private handleTabChanged() {\n const tabs = this.shadowRoot.querySelector('temba-tabs') as TabPane;\n this.currentTab = tabs.getCurrentTab();\n }\n\n public firstUpdated(changes: Map<string, any>): void {\n super.firstUpdated(changes);\n\n if (changes.has('languages') && this.languages.length > 0) {\n this.currentLanguage = this.languages[0].iso;\n }\n\n if (changes.has('value')) {\n this.langValues = this.getDeserializedValue() || {};\n this.variables = this.langValues[this.currentLanguage]?.variables || [];\n this.template = this.langValues[this.currentLanguage]?.template || null;\n }\n this.setFocusOnChatbox();\n }\n\n public updated(changes: Map<string, any>): void {\n super.updated(changes);\n\n if (changes.has('currentLanguage') && this.langValues) {\n let langValue = {\n text: '',\n attachments: [],\n quick_replies: []\n };\n\n if (this.currentLanguage in this.langValues) {\n langValue = this.langValues[this.currentLanguage];\n }\n\n this.currentText = langValue.text;\n this.initialText = langValue.text;\n this.currentAttachments = langValue.attachments;\n this.currentQuickReplies = (langValue.quick_replies || []).map(\n (value) => {\n return { name: value, value };\n }\n );\n this.currentOptin = langValue['optin'] ? [langValue['optin']] : [];\n this.setFocusOnChatbox();\n\n // TODO: this feels like it shouldn't be needed\n const chatbox = this.shadowRoot.querySelector('.chatbox') as any;\n if (chatbox) {\n chatbox.value = this.initialText;\n }\n this.resetTabs();\n this.requestUpdate('currentAttachments');\n }\n\n if (\n (this.langValues &&\n (changes.has('currentText') ||\n changes.has('currentAttachments') ||\n changes.has('currentQuickReplies'))) ||\n changes.has('currentOptin') ||\n changes.has('currentTemplate') ||\n changes.has('variables')\n ) {\n this.toggleButton();\n\n const trimmed = this.currentText ? this.currentText.trim() : '';\n if (\n trimmed ||\n (this.currentAttachments || []).length > 0 ||\n this.currentQuickReplies.length > 0 ||\n this.variables.length > 0\n ) {\n this.langValues[this.currentLanguage] = {\n text: trimmed,\n attachments: this.currentAttachments,\n quick_replies: this.currentQuickReplies.map((option) => option.value),\n optin: this.currentOptin.length > 0 ? this.currentOptin[0] : null,\n template: this.currentTemplate ? this.currentTemplate.uuid : null,\n variables: this.variables,\n locale: this.locale\n };\n } else {\n delete this.langValues[this.currentLanguage];\n }\n this.fireCustomEvent(CustomEventType.ContentChanged, this.langValues);\n this.requestUpdate('langValues');\n this.setValue(this.langValues);\n }\n }\n\n private handleAttachmentsChanged(event: CustomEvent) {\n const media = event.target as MediaPicker;\n this.currentAttachments = media.attachments;\n this.requestUpdate();\n }\n\n private setFocusOnChatbox(): void {\n if (this.chatbox) {\n const completion = this.shadowRoot.querySelector(\n '.chatbox'\n ) as Completion;\n if (completion) {\n window.setTimeout(() => {\n completion.focus();\n // this.resetTabs();\n }, 0);\n }\n }\n }\n\n public reset(): void {\n (this.shadowRoot.querySelector('.chatbox') as HTMLInputElement).value = '';\n this.initialText = '';\n this.currentText = '';\n this.currentQuickReplies = [];\n this.currentAttachments = [];\n this.buttonError = '';\n this.resetTabs();\n }\n\n private handleQuickReplyChange() {\n this.requestUpdate('currentQuickReplies');\n }\n\n private handleOptInChange(event: InputEvent) {\n this.currentOptin = (event.target as any).values;\n this.requestUpdate('optIn');\n }\n\n private handleChatboxChange(evt: Event) {\n const chatbox = evt.target as HTMLInputElement;\n this.currentText = chatbox.value;\n }\n\n public toggleButton() {\n if (this.button) {\n this.buttonError = '';\n const chatboxEmpty = this.currentText.trim().length === 0;\n const attachmentsEmpty = this.currentAttachments.length === 0;\n if (this.chatbox && this.attachments) {\n this.buttonDisabled = chatboxEmpty && attachmentsEmpty;\n } else if (this.chatbox) {\n this.buttonDisabled = chatboxEmpty;\n } else if (this.attachments) {\n this.buttonDisabled = attachmentsEmpty;\n } else {\n this.buttonDisabled = true;\n }\n }\n }\n\n private handleSendClick(evt: Event) {\n evt.stopPropagation();\n this.handleSend();\n }\n\n private handleSendEnter(evt: KeyboardEvent) {\n if (this.button) {\n if (evt.key === 'Enter' && !evt.shiftKey) {\n if (this.completion) {\n const chat = evt.target as Completion;\n if (!chat.hasVisibleOptions()) {\n this.handleSend();\n }\n } else {\n this.handleSend();\n }\n }\n }\n }\n\n private handleSend() {\n if (!this.buttonDisabled) {\n this.buttonDisabled = true;\n const name = this.buttonName;\n this.fireCustomEvent(CustomEventType.ButtonClicked, { name });\n }\n }\n\n private handleLanguageChange(evt: Event) {\n const select = evt.target as Select;\n this.currentLanguage = select.values[0].iso;\n }\n\n public resetTabs() {\n (this.shadowRoot.querySelector('temba-tabs') as TabPane).index = -1;\n }\n\n public render(): TemplateResult {\n return html`\n <temba-field\n name=${this.name}\n .errors=${this.errors}\n .widgetOnly=${this.widgetOnly}\n .value=${this.value}\n class=${getClasses({\n 'active-template':\n !!this.currentTemplate &&\n this.currentTab &&\n this.currentTab.name === 'Template'\n })}\n >\n ${this.languages.length > 1\n ? html`<temba-select\n @change=${this.handleLanguageChange}\n class=\"language\"\n name=\"language\"\n .staticOptions=${this.languages}\n valueKey=\"iso\"\n >\n </temba-select>`\n : null}\n <div class=\"container\">\n ${this.chatbox ? html`${this.getChatbox()}` : null}\n <div class=\"items actions\">${this.getActions()}</div>\n </div>\n </temba-field>\n `;\n }\n\n private getChatbox(): TemplateResult {\n if (this.completion) {\n return html`<temba-completion\n class=\"chatbox\"\n .value=${this.initialText}\n gsm\n textarea\n ?autogrow=${this.autogrow}\n maxlength=${this.maxLength}\n @change=${this.handleChatboxChange}\n @keydown=${this.handleSendEnter}\n placeholder=\"Write something here\"\n >\n </temba-completion>`;\n } else {\n return html`<temba-textinput\n class=\"chatbox\"\n gsm\n textarea\n ?autogrow=${this.autogrow}\n maxlength=${this.maxLength}\n .value=${this.initialText}\n @change=${this.handleChatboxChange}\n @keydown=${this.handleSendEnter}\n placeholder=\"Write something here\"\n >\n </temba-textinput>`;\n }\n }\n\n private handleTemplateChanged(evt: CustomEvent) {\n this.currentTemplate = evt.detail.template;\n this.locale = evt.detail.translation?.locale;\n this.requestUpdate();\n }\n\n private handleTemplateVariablesChanged(evt: CustomEvent) {\n this.variables = [...evt.detail.variables];\n }\n\n private getActions(): TemplateResult {\n const showOptins = this.optIns && this.isBaseLanguage();\n const showTemplates = this.templates && this.isBaseLanguage();\n return html`\n <temba-tabs\n embedded\n focusedname\n bottom\n unselect\n @temba-context-changed=${this.handleTabChanged}\n refresh=\"${(this.currentAttachments || []).length}|${this.index}|${this\n .currentQuickReplies.length}|${showOptins}|${this\n .currentOptin}|${showTemplates}|${this.currentTemplate}\"\n >\n ${this.attachments\n ? html`<temba-tab\n name=\"Attachments\"\n icon=\"attachment\"\n .count=${(this.currentAttachments || []).length}\n >\n <div class=\"items attachments\">\n <temba-media-picker\n accept=${this.accept}\n max=${this.maxAttachments}\n attachments=${JSON.stringify(this.currentAttachments || [])}\n @change=${this.handleAttachmentsChanged.bind(this)}\n ></temba-media-picker>\n </div>\n </temba-tab>`\n : null}\n ${this.quickReplies\n ? html`<temba-tab\n name=\"Quick Replies\"\n icon=\"quick_replies\"\n .count=${this.currentQuickReplies.length}\n >\n <temba-select\n @change=${this.handleQuickReplyChange}\n .values=${this.currentQuickReplies}\n class=\"quick-replies\"\n tags\n multi\n searchable\n expressions\n placeholder=\"Add Quick Reply\"\n ></temba-select>\n </temba-tab>`\n : null}\n <temba-tab\n name=\"Opt-in\"\n icon=\"channel_fba\"\n ?hidden=${!showOptins}\n ?checked=${this.currentOptin.length > 0}\n >\n <temba-select\n @change=${this.handleOptInChange}\n .values=${this.currentOptin}\n endpoint=\"${this.optinEndpoint}\"\n class=\"optins\"\n searchable\n clearable\n placeholder=\"Select an opt-in to use for Facebook (optional)\"\n ></temba-select>\n </temba-tab>\n\n <temba-tab\n name=\"Template\"\n icon=\"channel_wa\"\n ?alert=${this.errors &&\n this.errors.find((error) => error.includes('template'))}\n ?hidden=${!showTemplates}\n ?checked=${this.currentTemplate}\n >\n <temba-template-editor\n @temba-context-changed=${this.handleTemplateChanged}\n @temba-content-changed=${this.handleTemplateVariablesChanged}\n template=${this.template}\n variables=${JSON.stringify(this.variables)}\n url=${this.templateEndpoint}\n lang=${this.currentLanguage}\n >\n </temba-template-editor>\n </temba-tab>\n\n <div slot=\"tab-right\" class=\"top-right\">\n ${this.buttonError\n ? html`<div class=\"send-error\">${this.buttonError}</div>`\n : null}\n ${this.counter ? this.getCounter() : null}\n ${this.button ? this.getButton() : null}\n </div>\n </temba-tabs>\n `;\n }\n\n private getCounter(): TemplateResult {\n return html`<temba-charcount\n .text=\"${this.currentText}\"\n ></temba-charcount>`;\n }\n\n private getButton(): TemplateResult {\n return html` <temba-button\n id=\"send-button\"\n name=${this.buttonName}\n @click=${this.handleSendClick}\n ?disabled=${this.buttonDisabled}\n ></temba-button>`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Compose.js","sourceRoot":"","sources":["../../../src/compose/Compose.ts"],"names":[],"mappings":"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","sourcesContent":["import { TemplateResult, html, css } from 'lit';\nimport { FormElement } from '../FormElement';\nimport { property } from 'lit/decorators.js';\nimport { Attachment, CustomEventType, Language, Shortcut } from '../interfaces';\nimport { DEFAULT_MEDIA_ENDPOINT, getClasses } from '../utils';\nimport { Completion } from '../completion/Completion';\nimport { Select } from '../select/Select';\nimport { TabPane } from '../tabpane/TabPane';\nimport { MediaPicker } from '../mediapicker/MediaPicker';\nimport { Tab } from '../tabpane/Tab';\nimport { TextInput } from '../textinput/TextInput';\nimport { ShortcutList } from '../list/ShortcutList';\n\nexport class Compose extends FormElement {\n static get styles() {\n return css`\n :host {\n overflow: hidden;\n border-top-right-radius: var(--curvature);\n border-top-left-radius: var(--curvature);\n }\n\n .active-template .chatbox {\n display: none;\n }\n\n .active-template .actions {\n border: none;\n }\n\n .container {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n position: relative;\n overflow: hidden;\n border-radius: var(--compose-curvature, var(--curvature-widget));\n background: var(--color-widget-bg);\n border: var(--compose-border, 1px solid var(--color-widget-border));\n transition: all ease-in-out var(--transition-speed);\n box-shadow: var(--compose-shadow, var(--widget-box-shadow));\n caret-color: var(--input-caret);\n --color-widget-bg-focused: transparent;\n --color-widget-bg: transparent;\n }\n\n .chatbox {\n --color-widget-border: none;\n --curvature-widget: var(\n --compose-curvature,\n var(--curvature) var(--curvature) 0px 0px\n );\n\n --widget-box-shadow: none;\n display: block;\n flex-grow: 1;\n --widget-box-shadow-focused: none;\n --temba-textinput-padding: 1em 1em;\n }\n\n .actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0em;\n background: #f9f9f9;\n }\n\n .actions-right {\n display: flex;\n align-items: center;\n }\n\n temba-charcount {\n margin-right: 5px;\n overflow: hidden;\n --temba-charcount-counts-margin-top: 0px;\n --temba-charcount-summary-margin-top: 0px;\n --temba-charcount-summary-position: fixed;\n --temba-charcount-summary-right: 105px;\n --temba-charcount-summary-bottom: 105px;\n }\n\n temba-button {\n --button-y: 1px;\n --button-x: 12px;\n }\n\n .send-error {\n color: rgba(250, 0, 0, 0.75);\n font-size: var(--help-text-size);\n padding: 0.5em;\n }\n\n .language {\n margin-bottom: 0.6em;\n display: block;\n }\n\n .top-right {\n align-items: center;\n display: flex;\n }\n\n .gutter {\n align-items: center;\n display: flex;\n margin: 0.5em;\n }\n\n #send-button {\n margin: 0.3em;\n }\n\n temba-tabs {\n --focused-tab-color: #f4f4f4;\n min-height: var(--compose-min-height, 13.5em);\n }\n\n .quick-replies {\n margin: 0.8em;\n }\n\n .optins {\n margin: 0.8em;\n }\n\n .templates {\n margin: 0.8em;\n }\n\n .attachments {\n min-height: 5em;\n padding: 0.2em;\n align-items: center;\n display: flex;\n background: #f9f9f9;\n border-radius: var(--curvature);\n margin: 0.6em;\n margin-bottom: 0em;\n }\n\n .pane-bottom {\n border: 0px solid red;\n --color-placeholder: rgba(0, 0, 0, 0.2);\n flex-grow: 99;\n }\n\n .shortcut-wrapper {\n max-height: var(--shortcuts-height, 12em);\n display: flex;\n flex-direction: row;\n align-items: stretch;\n --options-block-shadow: none;\n --curvature-widget: 0px;\n --color-options-bg: #fff;\n border-bottom: 1px solid var(--color-widget-border);\n }\n\n temba-shortcuts {\n flex-grow: 1;\n }\n\n .quick-replies {\n background: #f9f9f9;\n }\n `;\n }\n\n @property({ type: Number })\n index = 1;\n\n @property({ type: Number })\n maxAttachments = 3;\n\n @property({ type: Number })\n maxLength = 640;\n\n @property({ type: Boolean })\n completion: boolean;\n\n @property({ type: Boolean })\n chatbox: boolean;\n\n @property({ type: Boolean })\n attachments: boolean;\n\n @property({ type: Boolean })\n quickReplies: boolean;\n\n @property({ type: Boolean })\n optIns: boolean;\n\n @property({ type: Boolean })\n templates: boolean;\n\n @property({ type: Boolean })\n counter: boolean;\n\n @property({ type: Boolean })\n button: boolean;\n\n @property({ type: Boolean })\n autogrow: boolean;\n\n @property({ type: String })\n currentText = '';\n\n @property({ type: String })\n initialText = '';\n\n @property({ type: String })\n accept = ''; //e.g. \".xls,.xlsx\"\n\n @property({ type: String, attribute: false })\n endpoint = DEFAULT_MEDIA_ENDPOINT;\n\n @property({ type: Boolean, attribute: false })\n uploading: boolean;\n\n @property({ type: Array })\n languages: Language[] = [];\n\n @property({ type: Array })\n currentAttachments: Attachment[] = [];\n\n @property({ type: Array })\n currentQuickReplies: { name: string; value: string }[] = [];\n\n @property({ type: Array })\n currentOptin: { name: string; uuid: string }[] = [];\n\n @property({ type: Array })\n variables: string[] = [];\n\n @property({ type: String })\n template: string;\n\n @property({ type: Object })\n currentTemplate: { name: string; uuid: string };\n\n // locale for the template\n @property({ type: String })\n locale: string;\n\n @property({ type: String })\n optinEndpoint = '/api/v2/optins.json';\n\n @property({ type: String })\n templateEndpoint = '/api/internal/templates.json';\n\n @property({ type: String })\n buttonName = 'Send';\n\n @property({ type: Boolean, attribute: false })\n buttonDisabled = true;\n\n @property({ type: String, attribute: false })\n buttonError = '';\n\n @property({ type: Boolean, attribute: 'widget_only' })\n widgetOnly: boolean;\n\n @property({ type: Array })\n errors: string[];\n\n @property({ type: Object })\n langValues: {\n [lang: string]: {\n text: string;\n attachments: Attachment[];\n quick_replies: string[];\n optin?: { name: string; uuid: string };\n template?: string;\n variables?: string[];\n locale?: string;\n };\n } = {};\n\n @property({ type: String })\n currentLanguage = 'und';\n\n @property({ type: Object })\n currentTab: Tab;\n\n @property({ type: Boolean })\n hasPendingText = false;\n\n @property({ type: Object })\n activeShortcut: Shortcut;\n\n public constructor() {\n super();\n }\n\n private isBaseLanguage(): boolean {\n return (\n this.currentLanguage == 'und' ||\n this.currentLanguage == this.languages[0].iso\n );\n }\n\n private handleTabChanged() {\n const tabs = this.shadowRoot.querySelector('temba-tabs') as TabPane;\n this.currentTab = tabs.getCurrentTab();\n\n if (this.currentTab && this.currentTab.name === 'Shortcuts') {\n const shortcuts = this.shadowRoot.querySelector(\n 'temba-shortcuts'\n ) as ShortcutList;\n shortcuts.filter = '';\n }\n this.setFocusOnChatbox();\n }\n\n public firstUpdated(changes: Map<string, any>): void {\n super.firstUpdated(changes);\n\n if (changes.has('languages') && this.languages.length > 0) {\n this.currentLanguage = this.languages[0].iso;\n }\n\n if (changes.has('value')) {\n this.langValues = this.getDeserializedValue() || {};\n this.variables = this.langValues[this.currentLanguage]?.variables || [];\n this.template = this.langValues[this.currentLanguage]?.template || null;\n }\n this.setFocusOnChatbox();\n }\n\n public updated(changes: Map<string, any>): void {\n super.updated(changes);\n\n if (changes.has('currentLanguage') && this.langValues) {\n let langValue = {\n text: '',\n attachments: [],\n quick_replies: []\n };\n\n if (this.currentLanguage in this.langValues) {\n langValue = this.langValues[this.currentLanguage];\n }\n\n this.currentText = langValue.text;\n this.initialText = langValue.text;\n this.currentAttachments = langValue.attachments;\n this.currentQuickReplies = (langValue.quick_replies || []).map(\n (value) => {\n return { name: value, value };\n }\n );\n this.currentOptin = langValue['optin'] ? [langValue['optin']] : [];\n this.setFocusOnChatbox();\n\n // TODO: this feels like it shouldn't be needed\n const chatbox = this.shadowRoot.querySelector('.chatbox') as any;\n if (chatbox) {\n chatbox.value = this.initialText;\n }\n this.resetTabs();\n this.requestUpdate('currentAttachments');\n }\n\n if (\n (this.langValues &&\n (changes.has('currentText') ||\n changes.has('currentAttachments') ||\n changes.has('currentQuickReplies'))) ||\n changes.has('currentOptin') ||\n changes.has('currentTemplate') ||\n changes.has('variables')\n ) {\n this.toggleButton();\n\n const trimmed = this.currentText ? this.currentText.trim() : '';\n if (\n trimmed ||\n (this.currentAttachments || []).length > 0 ||\n this.currentQuickReplies.length > 0 ||\n this.variables.length > 0\n ) {\n this.langValues[this.currentLanguage] = {\n text: trimmed,\n attachments: this.currentAttachments,\n quick_replies: this.currentQuickReplies.map((option) => option.value),\n optin: this.currentOptin.length > 0 ? this.currentOptin[0] : null,\n template: this.currentTemplate ? this.currentTemplate.uuid : null,\n variables: this.variables,\n locale: this.locale\n };\n } else {\n delete this.langValues[this.currentLanguage];\n }\n this.fireCustomEvent(CustomEventType.ContentChanged, this.langValues);\n this.requestUpdate('langValues');\n this.setValue(this.langValues);\n }\n }\n\n private handleAttachmentsChanged(event: CustomEvent) {\n const media = event.target as MediaPicker;\n this.currentAttachments = media.attachments;\n this.requestUpdate();\n }\n\n private setFocusOnChatbox(): void {\n if (this.chatbox) {\n const completion = this.shadowRoot.querySelector(\n '.chatbox'\n ) as Completion;\n if (completion) {\n window.setTimeout(() => {\n completion.focus();\n }, 0);\n }\n }\n }\n\n public reset(): void {\n const completion = this.shadowRoot.querySelector('.chatbox') as Completion;\n completion.textInputElement.value = '';\n completion.value = '';\n this.initialText = '';\n this.currentText = '';\n this.currentQuickReplies = [];\n this.currentAttachments = [];\n this.buttonError = '';\n this.resetTabs();\n }\n\n private handleQuickReplyChange() {\n this.requestUpdate('currentQuickReplies');\n }\n\n private handleOptInChange(event: InputEvent) {\n this.currentOptin = (event.target as any).values;\n this.requestUpdate('optIn');\n }\n\n private handleChatboxChange(evt: Event) {\n const chatbox = evt.target as Completion;\n const inputElement = chatbox.getTextInput().inputElement;\n\n this.currentText = inputElement.value;\n this.hasPendingText = inputElement.value.length > 0;\n\n // is the last character a / and is it at the beginning of the line\n const cursor = inputElement.selectionStart;\n const text = inputElement.value;\n const lineStart = text.lastIndexOf('\\n', cursor - 1) + 1;\n const line = text.substring(lineStart, cursor);\n\n if (line.startsWith('/')) {\n // switch to the shortcuts tab\n const tabs = this.shadowRoot.querySelector('temba-tabs') as TabPane;\n tabs.focusTab('Shortcuts');\n\n const shortcuts = this.shadowRoot.querySelector(\n 'temba-shortcuts'\n ) as ShortcutList;\n shortcuts.filter = line.substring(1);\n }\n }\n\n public toggleButton() {\n if (this.button) {\n this.buttonError = '';\n const chatboxEmpty = this.currentText.trim().length === 0;\n const attachmentsEmpty = this.currentAttachments.length === 0;\n if (this.chatbox && this.attachments) {\n this.buttonDisabled = chatboxEmpty && attachmentsEmpty;\n } else if (this.chatbox) {\n this.buttonDisabled = chatboxEmpty;\n } else if (this.attachments) {\n this.buttonDisabled = attachmentsEmpty;\n } else {\n this.buttonDisabled = true;\n }\n }\n }\n\n private handleSendClick(evt: Event) {\n evt.stopPropagation();\n this.handleSend();\n }\n\n private getCurrentLine(): { text: string; index: number } {\n const chatbox = this.shadowRoot.querySelector('.chatbox') as Completion;\n\n const cursor = chatbox.getTextInput().inputElement.selectionStart - 1;\n const text = chatbox.value;\n const start = text.substring(0, cursor).lastIndexOf('\\n') + 1;\n\n let end = chatbox.value.indexOf('\\n', start);\n if (end === -1) {\n end = chatbox.value.length;\n }\n\n return { text: chatbox.value.substring(start, end), index: start };\n }\n\n private handleKeyDown(evt: KeyboardEvent) {\n const tabs = this.shadowRoot.querySelector('temba-tabs') as TabPane;\n const num = parseInt(evt.key);\n if (\n !Number.isNaN(num) &&\n num > 0 &&\n evt.ctrlKey &&\n evt.metaKey &&\n num <= tabs.tabs.length\n ) {\n tabs.index = num - 1;\n }\n\n // if they type / as the first character in a line, switch to the shortcut\n if (evt.key === '/' && this.currentTab.name !== 'Shortcuts') {\n const line = this.getCurrentLine();\n const text = line.text.trim();\n if (text.trim().length === 1) {\n evt.preventDefault();\n tabs.index = tabs.tabs.findIndex((tab) => tab.name === 'Shortcuts');\n }\n } else if (evt.key === 'Backspace') {\n const line = this.getCurrentLine();\n const text = line.text;\n if (text === '/') {\n tabs.index = tabs.tabs.findIndex((tab) => tab.name === 'Reply');\n }\n }\n\n if (this.currentTab.name === 'Shortcuts') {\n if (evt.key === 'Enter' && !evt.shiftKey) {\n return;\n }\n }\n\n if (this.button) {\n if (evt.key === 'Enter') {\n if (!evt.shiftKey) {\n evt.preventDefault();\n if (this.completion) {\n const chat = evt.target as Completion;\n if (!chat.hasVisibleOptions()) {\n this.handleSend();\n }\n } else {\n this.handleSend();\n }\n }\n }\n }\n }\n\n private handleSend() {\n if (!this.buttonDisabled) {\n this.buttonDisabled = true;\n const name = this.buttonName;\n this.fireCustomEvent(CustomEventType.ButtonClicked, { name });\n }\n }\n\n private handleLanguageChange(evt: Event) {\n const select = evt.target as Select;\n this.currentLanguage = select.values[0].iso;\n }\n\n public resetTabs() {\n (this.shadowRoot.querySelector('temba-tabs') as TabPane).index = 0;\n }\n\n public render(): TemplateResult {\n return html`\n <temba-field\n name=${this.name}\n .errors=${this.errors}\n .widgetOnly=${this.widgetOnly}\n .value=${this.value}\n class=${getClasses({\n 'active-template':\n !!this.currentTemplate &&\n this.currentTab &&\n this.currentTab.name === 'Template'\n })}\n >\n ${this.languages.length > 1\n ? html`<temba-select\n @change=${this.handleLanguageChange}\n class=\"language\"\n name=\"language\"\n .staticOptions=${this.languages}\n valueKey=\"iso\"\n >\n </temba-select>`\n : null}\n <div class=\"container\">\n <div class=\"items actions\">${this.getActions()}</div>\n </div>\n </temba-field>\n `;\n }\n\n private handleTemplateChanged(evt: CustomEvent) {\n this.currentTemplate = evt.detail.template;\n this.locale = evt.detail.translation?.locale;\n this.requestUpdate();\n }\n\n private handleTemplateVariablesChanged(evt: CustomEvent) {\n this.variables = [...evt.detail.variables];\n }\n\n public getTextInput(): TextInput {\n return (\n this.shadowRoot.querySelector('.chatbox') as Completion\n ).getTextInput();\n }\n\n public handleShortcutSelection(event: CustomEvent) {\n this.activeShortcut = event.detail.selected;\n const line = this.getCurrentLine();\n const chatbox = this.getTextInput();\n\n const originalText = chatbox.value;\n\n if (line.text.startsWith('/')) {\n const newText =\n originalText.substring(0, line.index) +\n this.activeShortcut.text +\n originalText.substring(line.index + line.text.length);\n\n chatbox.updateValue(newText);\n\n // set our cursor to the end of the shortcut\n const cursor = line.index + this.activeShortcut.text.length;\n chatbox.inputElement.setSelectionRange(cursor, cursor);\n } else {\n // add the text where the cursor is\n const cursor = chatbox.inputElement.selectionStart;\n const newText =\n originalText.substring(0, cursor) +\n this.activeShortcut.text +\n originalText.substring(cursor);\n chatbox.updateValue(newText);\n\n // set the cursor to the end of the shortcut text\n const newCursor = cursor + this.activeShortcut.text.length;\n chatbox.inputElement.setSelectionRange(newCursor, newCursor);\n }\n\n const tabs = this.shadowRoot.querySelector('temba-tabs') as TabPane;\n tabs.index = tabs.tabs.findIndex((tab) => tab.name === 'Reply');\n }\n\n private getActions(): TemplateResult {\n const showOptins = this.optIns && this.isBaseLanguage();\n const showTemplates = this.templates && this.isBaseLanguage();\n return html`\n <temba-tabs\n embedded\n focusedname\n index=\"0\"\n @temba-context-changed=${this.handleTabChanged}\n refresh=\"${(this.currentAttachments || []).length}|${this.index}|${this\n .currentQuickReplies.length}|${showOptins}|${this\n .currentOptin}|${showTemplates}|${this.currentTemplate}\"\n >\n <temba-tab\n name=\"Reply\"\n icon=\"message\"\n selectionBackground=\"#fff\"\n ></temba-tab>\n ${this.attachments\n ? html`<temba-tab\n name=\"Attachments\"\n icon=\"attachment\"\n selectionBackground=\"#fff\"\n .count=${(this.currentAttachments || []).length}\n >\n <div class=\"items attachments\">\n <temba-media-picker\n accept=${this.accept}\n max=${this.maxAttachments}\n attachments=${JSON.stringify(this.currentAttachments || [])}\n @change=${this.handleAttachmentsChanged.bind(this)}\n ></temba-media-picker>\n </div>\n </temba-tab>`\n : null}\n ${this.quickReplies\n ? html`<temba-tab\n name=\"Quick Replies\"\n icon=\"quick_replies\"\n selectionBackground=\"#fff\"\n .count=${this.currentQuickReplies.length}\n >\n <temba-select\n class=\"quick-replies\"\n @change=${this.handleQuickReplyChange}\n .values=${this.currentQuickReplies}\n class=\"quick-replies\"\n tags\n multi\n searchable\n expressions\n placeholder=\"Add Quick Reply\"\n ></temba-select>\n </temba-tab>`\n : null}\n ${showOptins\n ? html`<temba-tab\n name=\"Opt-in\"\n icon=\"channel_fba\"\n selectionBackground=\"#fff\"\n ?hidden=${!showOptins}\n ?checked=${this.currentOptin.length > 0}\n >\n <temba-select\n @change=${this.handleOptInChange}\n .values=${this.currentOptin}\n endpoint=\"${this.optinEndpoint}\"\n class=\"optins\"\n searchable\n clearable\n placeholder=\"Select an opt-in to use for Facebook (optional)\"\n ></temba-select>\n </temba-tab>`\n : null}\n ${showTemplates\n ? html`<temba-tab\n name=\"Template\"\n icon=\"channel_wa\"\n selectionBackground=\"#fff\"\n ?alert=${this.errors &&\n this.errors.find((error) => error.includes('template'))}\n ?hidden=${!showTemplates}\n ?checked=${this.currentTemplate}\n >\n <temba-template-editor\n class=\"templates\"\n @temba-context-changed=${this.handleTemplateChanged}\n @temba-content-changed=${this.handleTemplateVariablesChanged}\n template=${this.template}\n variables=${JSON.stringify(this.variables)}\n url=${this.templateEndpoint}\n lang=${this.currentLanguage}\n >\n </temba-template-editor>\n </temba-tab>`\n : null}\n\n <!--temba-tab\n name=\"Note\"\n icon=\"notes\"\n activityColor=\"#ffbd00\"\n selectionBackground=\"#fff9c2\"\n borderColor=\"#ebdf6f\"\n ></temba-tab-->\n\n <temba-tab name=\"Shortcuts\" icon=\"shortcut\" selectionBackground=\"#fff\">\n <div class=\"shortcut-wrapper\">\n <temba-shortcuts\n @temba-selection=${this.handleShortcutSelection}\n ></temba-shortcuts>\n </div>\n </temba-tab>\n\n <div slot=\"tab-right\" class=\"top-right\">\n ${this.counter ? this.getCounter() : null}\n </div>\n\n <div\n slot=\"pane-bottom\"\n class=\"pane-bottom ${this.hasPendingText ? 'pending' : ''}\"\n >\n ${this.chatbox\n ? html`<temba-completion\n class=\"chatbox\"\n .value=${this.initialText}\n gsm\n textarea\n ?disableCompletion=${!this.completion}\n ?autogrow=${this.autogrow}\n maxlength=${this.maxLength}\n @change=${this.handleChatboxChange}\n @keydown=${this.handleKeyDown}\n placeholder=\"Write something here\"\n >\n </temba-completion>`\n : null}\n ${this.buttonError\n ? html`<div class=\"send-error\">${this.buttonError}</div>`\n : null}\n </div>\n </temba-tabs>\n `;\n }\n\n private getCounter(): TemplateResult {\n return html`<temba-charcount\n .text=\"${this.currentText}\"\n ></temba-charcount>`;\n }\n\n private getButton(): TemplateResult {\n return html`<temba-icon\n tabindex=\"1\"\n class=\"send-icon\"\n name=\"send\"\n size=\"1\"\n clickable\n @click=${this.handleSendClick}\n ></temba-icon>`;\n }\n}\n"]}
|
|
@@ -214,17 +214,16 @@ export class ContactChat extends ContactStoreElement {
|
|
|
214
214
|
min-height: 0;
|
|
215
215
|
}
|
|
216
216
|
|
|
217
|
-
.
|
|
217
|
+
.compose {
|
|
218
218
|
background: #fff;
|
|
219
219
|
display: flex;
|
|
220
220
|
flex-direction: column;
|
|
221
|
-
--textarea-min-height:
|
|
222
|
-
--textarea-height:
|
|
221
|
+
--textarea-min-height: 8em;
|
|
222
|
+
--textarea-height: 0.5em;
|
|
223
223
|
--widget-box-shadow-focused: none;
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
border-bottom-right-radius: 0 !important;
|
|
224
|
+
--compose-curvature: 0px;
|
|
225
|
+
border-top: 1px solid #e6e6e6;
|
|
226
|
+
overflow: hidden;
|
|
228
227
|
}
|
|
229
228
|
|
|
230
229
|
.closed-footer {
|
|
@@ -259,8 +258,11 @@ export class ContactChat extends ContactStoreElement {
|
|
|
259
258
|
}
|
|
260
259
|
|
|
261
260
|
.border {
|
|
262
|
-
|
|
263
|
-
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
temba-compose {
|
|
264
|
+
border-top-right-radius: 0;
|
|
265
|
+
border-top-left-radius: 0;
|
|
264
266
|
}
|
|
265
267
|
`;
|
|
266
268
|
}
|
|
@@ -383,9 +385,9 @@ export class ContactChat extends ContactStoreElement {
|
|
|
383
385
|
const contactHistory = this.currentContact
|
|
384
386
|
? this.getTembaContactHistory()
|
|
385
387
|
: null;
|
|
386
|
-
const
|
|
388
|
+
const tembaCompose = this.currentContact ? this.getTembaCompose() : null;
|
|
387
389
|
const contactHistoryAndChatbox = html `
|
|
388
|
-
<div class="chat-wrapper">${contactHistory} ${
|
|
390
|
+
<div class="chat-wrapper">${contactHistory} ${tembaCompose}</div>
|
|
389
391
|
`;
|
|
390
392
|
return html `${contactHistoryAndChatbox}`;
|
|
391
393
|
}
|
|
@@ -712,7 +714,7 @@ export class ContactChat extends ContactStoreElement {
|
|
|
712
714
|
agent
|
|
713
715
|
></temba-chat>`;
|
|
714
716
|
}
|
|
715
|
-
|
|
717
|
+
getTembaCompose() {
|
|
716
718
|
if (this.currentTicket) {
|
|
717
719
|
if (this.currentContact && this.currentContact.status !== 'active') {
|
|
718
720
|
//no chatbox for archived, blocked, or stopped contacts
|
|
@@ -721,7 +723,7 @@ export class ContactChat extends ContactStoreElement {
|
|
|
721
723
|
else {
|
|
722
724
|
if (!this.currentTicket.closed_on) {
|
|
723
725
|
//chatbox for active contacts with an open ticket
|
|
724
|
-
return this.
|
|
726
|
+
return this.getCompose();
|
|
725
727
|
}
|
|
726
728
|
else {
|
|
727
729
|
return null;
|
|
@@ -734,12 +736,12 @@ export class ContactChat extends ContactStoreElement {
|
|
|
734
736
|
}
|
|
735
737
|
else {
|
|
736
738
|
//chatbox for active contacts
|
|
737
|
-
return this.
|
|
739
|
+
return this.getCompose();
|
|
738
740
|
}
|
|
739
741
|
}
|
|
740
|
-
|
|
742
|
+
getCompose() {
|
|
741
743
|
return html `<div class="border"></div>
|
|
742
|
-
<div class="
|
|
744
|
+
<div class="compose">
|
|
743
745
|
<temba-compose
|
|
744
746
|
chatbox
|
|
745
747
|
attachments
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContactChat.js","sourceRoot":"","sources":["../../../src/contacts/ContactChat.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-this-alias */\nimport { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { Contact, CustomEventType, Ticket } from '../interfaces';\nimport { oxford, oxfordFn, postJSON } from '../utils';\nimport { ContactStoreElement } from './ContactStoreElement';\nimport { Compose } from '../compose/Compose';\nimport { fetchContactHistory, getDisplayName } from './helpers';\nimport {\n AirtimeTransferredEvent,\n CampaignFiredEvent,\n ChannelEvent,\n ContactEvent,\n ContactGroupsEvent,\n ContactHistoryPage,\n ContactLanguageChangedEvent,\n EmailSentEvent,\n ErrorMessageEvent,\n FlowEvent,\n LabelsAddedEvent,\n MsgEvent,\n NameChangedEvent,\n OptinRequestedEvent,\n TicketEvent,\n UpdateFieldEvent,\n UpdateResultEvent,\n URNsChangedEvent,\n WebhookEvent\n} from './events';\nimport { Chat, ChatEvent, MessageType } from '../chat/Chat';\nimport { getUserDisplay } from '../webchat';\nimport { DEFAULT_AVATAR } from '../webchat/assets';\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\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 TICKET_TOPIC_CHANGED = 'ticket_topic_changed',\n OPTIN_REQUESTED = 'optin_requested',\n ERROR = 'error',\n FAILURE = 'failure'\n}\n\nconst renderInfoList = (singular: string, plural: string, items: any[]) => {\n if (items.length === 1) {\n return `${singular} **${items[0].name}**`;\n } else {\n const list = items.map((item) => `**${item.name}**`);\n if (list.length === 2) {\n return `${plural} ${list.join(' and ')}`;\n } else {\n const last = list.pop();\n return `${plural} ${list.join(', ')}, and ${last}`;\n }\n }\n};\n\nconst toTitleCase = (str: string) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\nconst renderChannelEvent = (event: ChannelEvent): string => {\n if (event.event.type === 'mt_miss') {\n return 'Missed outgoing call';\n } else if (event.event.type === 'mo_miss') {\n return 'Missed incoming call';\n } else if (event.event.type === 'new_conversation') {\n return 'Started conversation';\n } else if (event.channel_event_type === 'welcome_message') {\n return 'Welcome Message Sent';\n } else if (event.event.type === 'referral') {\n return 'Referred';\n } else if (event.event.type === 'follow') {\n return 'Followed';\n } else if (event.event.type === 'stop_contact') {\n return 'Stopped';\n } else if (event.event.type === 'mt_call') {\n return 'Outgoing Phone Call';\n } else if (event.event.type == 'mo_call') {\n return 'Incoming Phone call';\n } else if (event.event.type == 'optin') {\n return `Opted in to **${event.event.optin?.name}**`;\n } else if (event.event.type == 'optout') {\n return `Opted out of **${event.event.optin?.name}**`;\n }\n};\n\nconst renderFlowEvent = (event: FlowEvent): string => {\n let verb = 'Interrupted';\n if (event.status !== 'I') {\n if (event.type === Events.FLOW_ENTERED) {\n verb = 'Started';\n } else {\n verb = 'Completed';\n }\n }\n return `${verb} [**${event.flow.name}**](/flow/editor/${event.flow.uuid}/)`;\n};\n\nconst renderResultEvent = (event: UpdateResultEvent): string => {\n if (!event.name.startsWith('_') && event.value) {\n return `Updated flow result **${event.name}** to **${event.value}**`;\n }\n};\n\nconst renderUpdateEvent = (event: UpdateFieldEvent): string => {\n return event.value\n ? `Updated **${event.field.name}** to **${event.value.text}**`\n : `Cleared **${event.field.name}**`;\n};\n\nconst renderNameChanged = (event: NameChangedEvent): string => {\n return `Updated **Contact Name** to **${event.name}**`;\n};\n\nconst renderContactURNsChanged = (event: URNsChangedEvent): string => {\n return `Updated **URNs** to ${oxfordFn(\n event.urns,\n (urn: string) => `**${urn.split(':')[1].split('?')[0]}**`\n )}`;\n};\n\nconst renderEmailSent = (event: EmailSentEvent): string => {\n return `Email sent to **${oxford(event.to, 'and')}** with subject **${\n event.subject\n }**`;\n};\n\nconst renderLabelsAdded = (event: LabelsAddedEvent): string => {\n return `Applied ${renderInfoList('label', 'labels', event.labels)}`;\n};\n\nexport const renderTicketAction = (\n event: TicketEvent,\n action: string\n): string => {\n if (event.created_by) {\n return `**${getUserDisplay(\n event.created_by\n )}** ${action} a **[ticket](/ticket/all/closed/${event.ticket.uuid}/)**`;\n }\n return `A **[ticket](/ticket/all/closed/${event.ticket.uuid}/)** was **${action}**`;\n};\n\nexport const renderTicketAssigned = (event: TicketEvent): string => {\n return event.assignee\n ? event.assignee.id === event.created_by.id\n ? `**${getDisplayName(event.created_by)}** took this ticket`\n : `${getDisplayName(\n event.created_by\n )} assigned this ticket to **${getDisplayName(event.assignee)}**`\n : `**${getDisplayName(event.created_by)}** unassigned this ticket`;\n};\n\nexport const renderContactGroupsEvent = (event: ContactGroupsEvent): string => {\n const groupsEvent = event as ContactGroupsEvent;\n if (groupsEvent.groups_added) {\n return renderInfoList(\n 'Added to group',\n 'Added to groups',\n groupsEvent.groups_added\n );\n } else if (groupsEvent.groups_removed) {\n return renderInfoList(\n 'Removed from group',\n 'Removed from groups',\n groupsEvent.groups_removed\n );\n }\n};\n\nexport const renderCampaignFiredEvent = (event: CampaignFiredEvent): string => {\n return `Campaign ${event.campaign.name}\n ${event.fired_result === 'S' ? 'skipped' : 'triggered'}\n ${event.campaign_event.offset_display}\n ${event.campaign_event.relative_to.name}`;\n};\n\nexport const renderTicketOpened = (event: TicketEvent): string => {\n return `${event.ticket.topic.name} ticket was opened`;\n};\n\nexport const renderErrorMessage = (event: ErrorMessageEvent): string => {\n return `${event.text} ${\n event.type === Events.FAILURE\n ? `Run ended prematurely, check the flow design`\n : null\n }`;\n};\n\nexport const renderWebhookEvent = (event: WebhookEvent): string => {\n return event.status === 'success'\n ? `Successfully called ${event.url}`\n : `Failed to call ${event.url}`;\n};\n\nexport const renderAirtimeTransferredEvent = (\n event: AirtimeTransferredEvent\n): string => {\n if (parseFloat(event.actual_amount) === 0) {\n return `Airtime transfer failed`;\n }\n return `Transferred **${event.actual_amount}** ${event.currency} of airtime`;\n};\n\nexport const renderCallStartedEvent = (): string => {\n return `Call Started`;\n};\n\nexport const renderContactLanguageChangedEvent = (\n event: ContactLanguageChangedEvent\n): string => {\n return `Language updated to **${event.language}**`;\n};\n\nexport const renderOptinRequested = (event: OptinRequestedEvent): string => {\n return `Requested opt-in for ${event.optin.name}`;\n};\n\nexport class ContactChat extends ContactStoreElement {\n public static get styles() {\n return css`\n :host {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n min-height: 0;\n --compose-shadow: none;\n --compose-border: none;\n --compose-padding: 3px;\n --compose-curvature: none;\n }\n\n .chat-wrapper {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n min-height: 0;\n }\n\n temba-contact-history {\n border-bottom: 1px solid #f6f6f6;\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .chatbox {\n background: #fff;\n display: flex;\n flex-direction: column;\n --textarea-min-height: 1em;\n --textarea-height: 1.2em;\n --widget-box-shadow-focused: none;\n }\n\n .chatbox.full {\n border-bottom-right-radius: 0 !important;\n }\n\n .closed-footer {\n padding: 1em;\n background: #f2f2f2;\n border-top: 3px solid #e1e1e1;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n a {\n color: var(--color-link-primary);\n }\n\n a:hover {\n text-decoration: underline;\n color: var(--color-link-primary-hover);\n }\n\n temba-button#reopen-button {\n --button-y: 1px;\n --button-x: 12px;\n }\n\n temba-completion {\n --widget-box-shadow: none;\n --color-widget-border: transparent;\n --widget-box-shadow-focused: none;\n --color-focus: transparent;\n --color-widget-bg-focused: transparent;\n }\n\n .border {\n border-top: 1px solid #f1f1f1;\n margin: 0 1em;\n }\n `;\n }\n\n @property({ type: String, attribute: 'ticket' })\n ticketUUID: string;\n\n @property({ type: String })\n contactsEndpoint = '/api/v2/contacts.json';\n\n @property({ type: String })\n currentNote = '';\n\n @property({ type: Boolean })\n showDetails = true;\n\n @property({ type: Object })\n currentTicket: Ticket = null;\n\n @property({ type: Object })\n currentContact: Contact = null;\n\n @property({ type: String })\n agent = '';\n\n @property({ type: Boolean })\n blockFetching = false;\n\n @property({ type: String })\n avatar = DEFAULT_AVATAR;\n\n // http promise to monitor for completeness\n public httpComplete: Promise<void>;\n private chat: Chat;\n\n ticket = null;\n lastEventTime = null;\n newestEventTime = null;\n refreshId = null;\n polling = false;\n\n constructor() {\n super();\n }\n\n public firstUpdated(\n changed: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(changed);\n }\n\n public connectedCallback() {\n super.connectedCallback();\n this.chat = this.shadowRoot.querySelector('temba-chat');\n }\n\n public disconnectedCallback() {\n if (this.refreshId) {\n clearInterval(this.refreshId);\n }\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // if we don't have an endpoint infer one\n if (\n changedProperties.has('data') ||\n changedProperties.has('currentContact')\n ) {\n this.currentContact = this.data;\n }\n\n if (changedProperties.has('currentContact')) {\n this.chat = this.shadowRoot.querySelector('temba-chat');\n this.reset();\n this.fetchPreviousMessages();\n }\n }\n\n private reset() {\n if (this.chat) {\n this.chat.reset();\n }\n this.blockFetching = false;\n this.ticket = null;\n this.lastEventTime = null;\n this.newestEventTime = null;\n this.refreshId = null;\n this.polling = false;\n }\n\n public refresh() {\n this.checkForNewMessages();\n }\n\n private handleSend(evt: CustomEvent) {\n const buttonName = evt.detail.name;\n if (buttonName === 'Send') {\n const payload = {\n contact: this.currentContact.uuid\n };\n const compose = evt.currentTarget as Compose;\n if (compose) {\n const text = compose.currentText;\n if (text && text.length > 0) {\n payload['text'] = text;\n }\n const attachments = compose.currentAttachments;\n if (attachments && attachments.length > 0) {\n const attachment_uuids = attachments.map(\n (attachment) => attachment.uuid\n );\n payload['attachments'] = attachment_uuids;\n }\n }\n if (this.currentTicket) {\n payload['ticket'] = this.currentTicket.uuid;\n }\n\n const genericError = buttonName + ' failed, please try again.';\n\n postJSON(`/api/v2/messages.json`, payload)\n .then((response) => {\n if (response.status < 400) {\n this.checkForNewMessages();\n compose.reset();\n this.fireCustomEvent(CustomEventType.MessageSent, { msg: payload });\n } else if (response.status < 500) {\n if (\n response.json.text &&\n response.json.text.length > 0 &&\n response.json.text[0].length > 0\n ) {\n let textError = response.json.text[0];\n textError = textError.replace(\n 'Ensure this field has no more than',\n 'Maximum allowed text is'\n );\n compose.buttonError = textError;\n } else if (\n response.json.attachments &&\n response.json.attachments.length > 0 &&\n response.json.attachments[0].length > 0\n ) {\n let attachmentError = response.json.attachments[0];\n attachmentError = attachmentError\n .replace(\n 'Ensure this field has no more than',\n 'Maximum allowed attachments is'\n )\n .replace('elements', 'files');\n compose.buttonError = attachmentError;\n } else {\n compose.buttonError = genericError;\n }\n } else {\n compose.buttonError = genericError;\n }\n })\n .catch((error) => {\n console.error(error);\n compose.buttonError = genericError;\n });\n }\n }\n\n public render(): TemplateResult {\n const contactHistory = this.currentContact\n ? this.getTembaContactHistory()\n : null;\n const chatbox = this.currentContact ? this.getTembaChatbox() : null;\n\n const contactHistoryAndChatbox = html`\n <div class=\"chat-wrapper\">${contactHistory} ${chatbox}</div>\n `;\n return html`${contactHistoryAndChatbox}`;\n }\n\n private getEndpoint() {\n return `/contact/history/${this.contact}/?_format=json`;\n }\n\n private scheduleRefresh() {\n // knock five seconds off the newest event time so we are\n // a little more aggressive about refreshing short term\n let window = new Date().getTime() - this.newestEventTime / 1000 - 5000;\n\n if (this.refreshId) {\n clearTimeout(this.refreshId);\n this.refreshId = null;\n }\n\n // wait no longer than 15 seconds\n window = Math.min(window, 15000);\n\n // wait at least 2 seconds\n window = Math.max(window, 2000);\n\n this.refreshId = setTimeout(() => {\n this.checkForNewMessages();\n }, window);\n }\n\n public getEventMessage(event: ContactEvent): ChatEvent {\n let message = null;\n switch (event.type) {\n case Events.ERROR:\n case Events.FAILURE:\n message = {\n type: MessageType.Inline,\n text: `Error during flow: ${toTitleCase(\n (event as ErrorMessageEvent).text\n )}`\n };\n break;\n case Events.TICKET_OPENED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'opened')\n };\n break;\n case Events.TICKET_ASSIGNED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAssigned(event as TicketEvent)\n };\n break;\n case Events.TICKET_REOPENED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'reopened')\n };\n break;\n case Events.TICKET_CLOSED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'closed')\n };\n break;\n case Events.TICKET_TOPIC_CHANGED:\n message = {\n type: MessageType.Inline,\n text: `Topic changed to **${(event as TicketEvent).topic.name}**`\n };\n break;\n case Events.FLOW_ENTERED:\n case Events.FLOW_EXITED:\n message = {\n type: MessageType.Inline,\n text: renderFlowEvent(event as FlowEvent)\n };\n break;\n case Events.RUN_RESULT_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderResultEvent(event as UpdateResultEvent)\n };\n break;\n case Events.CONTACT_FIELD_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderUpdateEvent(event as UpdateFieldEvent)\n };\n break;\n case Events.CONTACT_NAME_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderNameChanged(event as NameChangedEvent)\n };\n break;\n case Events.CONTACT_URNS_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactURNsChanged(event as URNsChangedEvent)\n };\n break;\n case Events.EMAIL_SENT:\n message = {\n type: MessageType.Inline,\n text: renderEmailSent(event as EmailSentEvent)\n };\n break;\n case Events.INPUT_LABELS_ADDED:\n message = {\n type: MessageType.Inline,\n text: renderLabelsAdded(event as LabelsAddedEvent)\n };\n break;\n case Events.CONTACT_GROUPS_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactGroupsEvent(event as ContactGroupsEvent)\n };\n break;\n case Events.WEBHOOK_CALLED:\n message = {\n type: MessageType.Inline,\n text: renderWebhookEvent(event as WebhookEvent)\n };\n break;\n case Events.AIRTIME_TRANSFERRED:\n message = {\n type: MessageType.Inline,\n text: renderAirtimeTransferredEvent(event as AirtimeTransferredEvent)\n };\n break;\n case Events.CALL_STARTED:\n message = {\n type: MessageType.Inline,\n text: renderCallStartedEvent()\n };\n break;\n case Events.CAMPAIGN_FIRED:\n message = {\n type: MessageType.Inline,\n text: renderCampaignFiredEvent(event as CampaignFiredEvent)\n };\n break;\n case Events.CHANNEL_EVENT:\n message = {\n type: MessageType.Inline,\n text: renderChannelEvent(event as ChannelEvent)\n };\n break;\n case Events.CONTACT_LANGUAGE_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactLanguageChangedEvent(\n event as ContactLanguageChangedEvent\n )\n };\n break;\n case Events.OPTIN_REQUESTED:\n message = {\n type: MessageType.Inline,\n text: renderOptinRequested(event as OptinRequestedEvent)\n };\n break;\n }\n\n if (message && event.created_on) {\n message.date = new Date(event.created_on);\n } else {\n console.error('Unknown event type', event);\n }\n\n return message;\n }\n\n private getUserForEvent(event: MsgEvent | TicketEvent) {\n let user = null;\n if (event.created_by) {\n const storeUser = this.store.getUser(event.created_by.email);\n if (storeUser) {\n user = {\n email: event.created_by.email,\n name: [storeUser.first_name, storeUser.last_name].join(' '),\n avatar: storeUser.avatar\n };\n }\n } else if (event.type === 'msg_received') {\n user = {\n name: this.currentContact.name\n };\n }\n return user;\n }\n\n private createMessages(page: ContactHistoryPage): ChatEvent[] {\n if (page.events) {\n let messages = [];\n page.events.forEach((event) => {\n const ts = new Date(event.created_on).getTime() * 1000;\n if (ts > this.newestEventTime) {\n this.newestEventTime = ts;\n }\n\n if (event.type === 'ticket_note_added') {\n const ticketEvent = event as TicketEvent;\n messages.push({\n type: MessageType.Note,\n id: event.created_on + event.type,\n user: this.getUserForEvent(ticketEvent),\n date: new Date(ticketEvent.created_on),\n text: ticketEvent.note\n });\n } else if (event.type === 'ticket_opened') {\n // ticket open events can have a note attached\n const ticketEvent = event as TicketEvent;\n messages.push({\n type: MessageType.Note,\n id: event.created_on + event.type + '_note',\n user: this.getUserForEvent(ticketEvent),\n date: new Date(ticketEvent.created_on),\n text: ticketEvent.note\n });\n\n // but the opening of the ticket is a normal event\n messages.push(this.getEventMessage(event));\n } else if (\n event.type === 'msg_created' ||\n event.type === 'msg_received' ||\n event.type === 'broadcast_created'\n ) {\n const msgEvent = event as MsgEvent;\n messages.push({\n type: msgEvent.type === 'msg_received' ? 'msg_in' : 'msg_out',\n id: msgEvent.msg.id + '',\n user: this.getUserForEvent(msgEvent),\n date: new Date(msgEvent.created_on),\n attachments: msgEvent.msg.attachments,\n text: msgEvent.msg.text,\n sendError: msgEvent.status === 'E' || msgEvent.status === 'F',\n popup: html`<div\n style=\"display: flex; flex-direction: row; align-items:center; justify-content: space-between;font-size:0.9em;line-height:1em;min-width:10em\"\n >\n <div style=\"justify-content:left;text-align:left\">\n <temba-date\n value=${msgEvent.created_on}\n display=\"duration\"\n ></temba-date>\n\n ${msgEvent.optin\n ? html`<div style=\"font-size:0.9em;color:#aaa\">\n ${msgEvent.optin.name}\n </div>`\n : null}\n ${msgEvent.failed_reason_display\n ? html`\n <div\n style=\"margin-top:0.2em;margin-right: 0.5em;min-width:10em;max-width:15em;color:var(--color-error);font-size:0.9em\"\n >\n ${msgEvent.failed_reason_display}\n </div>\n `\n : null}\n </div>\n ${msgEvent.logs_url\n ? html`<a style=\"margin-left:0.5em\" href=\"${msgEvent.logs_url}\"\n ><temba-icon name=\"log\"></temba-icon\n ></a>`\n : null}\n </div> `\n });\n } else {\n messages.push(this.getEventMessage(event));\n }\n });\n\n // remove any messages we don't recognize\n messages = messages.filter((msg) => !!msg);\n return messages as ChatEvent[];\n }\n return [];\n }\n\n private checkForNewMessages() {\n // we are already working on it\n if (this.polling) {\n return;\n }\n\n const chat = this.chat;\n const contactChat = this;\n if (this.currentContact && this.newestEventTime) {\n this.polling = true;\n const endpoint = this.getEndpoint();\n\n const fetchContact = this.currentContact.uuid;\n\n fetchContactHistory(\n false,\n endpoint,\n this.currentTicket?.uuid,\n null,\n this.newestEventTime\n ).then((page: ContactHistoryPage) => {\n if (fetchContact === this.currentContact.uuid) {\n this.lastEventTime = page.next_before;\n const messages = this.createMessages(page);\n if (messages.length === 0) {\n contactChat.blockFetching = true;\n }\n messages.reverse();\n chat.addMessages(messages, null, true);\n }\n this.polling = false;\n this.scheduleRefresh();\n });\n }\n }\n\n private fetchPreviousMessages() {\n const chat = this.chat;\n const contactChat = this;\n if (!chat || chat.fetching || contactChat.blockFetching) {\n return;\n }\n\n chat.fetching = true;\n if (this.currentContact) {\n const endpoint = this.getEndpoint();\n fetchContactHistory(\n false,\n endpoint,\n this.currentTicket?.uuid,\n this.lastEventTime\n ).then((page: ContactHistoryPage) => {\n this.lastEventTime = page.next_before;\n const messages = this.createMessages(page);\n messages.reverse();\n\n if (messages.length === 0) {\n contactChat.blockFetching = true;\n }\n chat.addMessages(messages);\n this.scheduleRefresh();\n });\n }\n }\n\n private fetchComplete() {\n this.chat.fetching = false;\n }\n\n private getTembaContactHistory(): TemplateResult {\n return html`<temba-chat\n @temba-scroll-threshold=${this.fetchPreviousMessages}\n @temba-fetch-complete=${this.fetchComplete}\n avatar=${this.avatar}\n agent\n ></temba-chat>`;\n }\n\n private getTembaChatbox(): TemplateResult {\n if (this.currentTicket) {\n if (this.currentContact && this.currentContact.status !== 'active') {\n //no chatbox for archived, blocked, or stopped contacts\n return null;\n } else {\n if (!this.currentTicket.closed_on) {\n //chatbox for active contacts with an open ticket\n return this.getChatbox();\n } else {\n return null;\n }\n }\n }\n\n if (this.currentContact && this.currentContact.status !== 'active') {\n //no chatbox for archived, blocked, or stopped contacts\n return null;\n } else {\n //chatbox for active contacts\n return this.getChatbox();\n }\n }\n\n private getChatbox(): TemplateResult {\n return html`<div class=\"border\"></div>\n <div class=\"chatbox\">\n <temba-compose\n chatbox\n attachments\n counter\n button\n autogrow\n @temba-button-clicked=${this.handleSend.bind(this)}\n >\n </temba-compose>\n </div>`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ContactChat.js","sourceRoot":"","sources":["../../../src/contacts/ContactChat.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-this-alias */\nimport { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { Contact, CustomEventType, Ticket } from '../interfaces';\nimport { oxford, oxfordFn, postJSON } from '../utils';\nimport { ContactStoreElement } from './ContactStoreElement';\nimport { Compose } from '../compose/Compose';\nimport { fetchContactHistory, getDisplayName } from './helpers';\nimport {\n AirtimeTransferredEvent,\n CampaignFiredEvent,\n ChannelEvent,\n ContactEvent,\n ContactGroupsEvent,\n ContactHistoryPage,\n ContactLanguageChangedEvent,\n EmailSentEvent,\n ErrorMessageEvent,\n FlowEvent,\n LabelsAddedEvent,\n MsgEvent,\n NameChangedEvent,\n OptinRequestedEvent,\n TicketEvent,\n UpdateFieldEvent,\n UpdateResultEvent,\n URNsChangedEvent,\n WebhookEvent\n} from './events';\nimport { Chat, ChatEvent, MessageType } from '../chat/Chat';\nimport { getUserDisplay } from '../webchat';\nimport { DEFAULT_AVATAR } from '../webchat/assets';\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\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 TICKET_TOPIC_CHANGED = 'ticket_topic_changed',\n OPTIN_REQUESTED = 'optin_requested',\n ERROR = 'error',\n FAILURE = 'failure'\n}\n\nconst renderInfoList = (singular: string, plural: string, items: any[]) => {\n if (items.length === 1) {\n return `${singular} **${items[0].name}**`;\n } else {\n const list = items.map((item) => `**${item.name}**`);\n if (list.length === 2) {\n return `${plural} ${list.join(' and ')}`;\n } else {\n const last = list.pop();\n return `${plural} ${list.join(', ')}, and ${last}`;\n }\n }\n};\n\nconst toTitleCase = (str: string) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\nconst renderChannelEvent = (event: ChannelEvent): string => {\n if (event.event.type === 'mt_miss') {\n return 'Missed outgoing call';\n } else if (event.event.type === 'mo_miss') {\n return 'Missed incoming call';\n } else if (event.event.type === 'new_conversation') {\n return 'Started conversation';\n } else if (event.channel_event_type === 'welcome_message') {\n return 'Welcome Message Sent';\n } else if (event.event.type === 'referral') {\n return 'Referred';\n } else if (event.event.type === 'follow') {\n return 'Followed';\n } else if (event.event.type === 'stop_contact') {\n return 'Stopped';\n } else if (event.event.type === 'mt_call') {\n return 'Outgoing Phone Call';\n } else if (event.event.type == 'mo_call') {\n return 'Incoming Phone call';\n } else if (event.event.type == 'optin') {\n return `Opted in to **${event.event.optin?.name}**`;\n } else if (event.event.type == 'optout') {\n return `Opted out of **${event.event.optin?.name}**`;\n }\n};\n\nconst renderFlowEvent = (event: FlowEvent): string => {\n let verb = 'Interrupted';\n if (event.status !== 'I') {\n if (event.type === Events.FLOW_ENTERED) {\n verb = 'Started';\n } else {\n verb = 'Completed';\n }\n }\n return `${verb} [**${event.flow.name}**](/flow/editor/${event.flow.uuid}/)`;\n};\n\nconst renderResultEvent = (event: UpdateResultEvent): string => {\n if (!event.name.startsWith('_') && event.value) {\n return `Updated flow result **${event.name}** to **${event.value}**`;\n }\n};\n\nconst renderUpdateEvent = (event: UpdateFieldEvent): string => {\n return event.value\n ? `Updated **${event.field.name}** to **${event.value.text}**`\n : `Cleared **${event.field.name}**`;\n};\n\nconst renderNameChanged = (event: NameChangedEvent): string => {\n return `Updated **Contact Name** to **${event.name}**`;\n};\n\nconst renderContactURNsChanged = (event: URNsChangedEvent): string => {\n return `Updated **URNs** to ${oxfordFn(\n event.urns,\n (urn: string) => `**${urn.split(':')[1].split('?')[0]}**`\n )}`;\n};\n\nconst renderEmailSent = (event: EmailSentEvent): string => {\n return `Email sent to **${oxford(event.to, 'and')}** with subject **${\n event.subject\n }**`;\n};\n\nconst renderLabelsAdded = (event: LabelsAddedEvent): string => {\n return `Applied ${renderInfoList('label', 'labels', event.labels)}`;\n};\n\nexport const renderTicketAction = (\n event: TicketEvent,\n action: string\n): string => {\n if (event.created_by) {\n return `**${getUserDisplay(\n event.created_by\n )}** ${action} a **[ticket](/ticket/all/closed/${event.ticket.uuid}/)**`;\n }\n return `A **[ticket](/ticket/all/closed/${event.ticket.uuid}/)** was **${action}**`;\n};\n\nexport const renderTicketAssigned = (event: TicketEvent): string => {\n return event.assignee\n ? event.assignee.id === event.created_by.id\n ? `**${getDisplayName(event.created_by)}** took this ticket`\n : `${getDisplayName(\n event.created_by\n )} assigned this ticket to **${getDisplayName(event.assignee)}**`\n : `**${getDisplayName(event.created_by)}** unassigned this ticket`;\n};\n\nexport const renderContactGroupsEvent = (event: ContactGroupsEvent): string => {\n const groupsEvent = event as ContactGroupsEvent;\n if (groupsEvent.groups_added) {\n return renderInfoList(\n 'Added to group',\n 'Added to groups',\n groupsEvent.groups_added\n );\n } else if (groupsEvent.groups_removed) {\n return renderInfoList(\n 'Removed from group',\n 'Removed from groups',\n groupsEvent.groups_removed\n );\n }\n};\n\nexport const renderCampaignFiredEvent = (event: CampaignFiredEvent): string => {\n return `Campaign ${event.campaign.name}\n ${event.fired_result === 'S' ? 'skipped' : 'triggered'}\n ${event.campaign_event.offset_display}\n ${event.campaign_event.relative_to.name}`;\n};\n\nexport const renderTicketOpened = (event: TicketEvent): string => {\n return `${event.ticket.topic.name} ticket was opened`;\n};\n\nexport const renderErrorMessage = (event: ErrorMessageEvent): string => {\n return `${event.text} ${\n event.type === Events.FAILURE\n ? `Run ended prematurely, check the flow design`\n : null\n }`;\n};\n\nexport const renderWebhookEvent = (event: WebhookEvent): string => {\n return event.status === 'success'\n ? `Successfully called ${event.url}`\n : `Failed to call ${event.url}`;\n};\n\nexport const renderAirtimeTransferredEvent = (\n event: AirtimeTransferredEvent\n): string => {\n if (parseFloat(event.actual_amount) === 0) {\n return `Airtime transfer failed`;\n }\n return `Transferred **${event.actual_amount}** ${event.currency} of airtime`;\n};\n\nexport const renderCallStartedEvent = (): string => {\n return `Call Started`;\n};\n\nexport const renderContactLanguageChangedEvent = (\n event: ContactLanguageChangedEvent\n): string => {\n return `Language updated to **${event.language}**`;\n};\n\nexport const renderOptinRequested = (event: OptinRequestedEvent): string => {\n return `Requested opt-in for ${event.optin.name}`;\n};\n\nexport class ContactChat extends ContactStoreElement {\n public static get styles() {\n return css`\n :host {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n min-height: 0;\n --compose-shadow: none;\n --compose-border: none;\n --compose-padding: 3px;\n --compose-curvature: none;\n }\n\n .chat-wrapper {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n min-height: 0;\n }\n\n temba-contact-history {\n border-bottom: 1px solid #f6f6f6;\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .compose {\n background: #fff;\n display: flex;\n flex-direction: column;\n --textarea-min-height: 8em;\n --textarea-height: 0.5em;\n --widget-box-shadow-focused: none;\n --compose-curvature: 0px;\n border-top: 1px solid #e6e6e6;\n overflow: hidden;\n }\n\n .closed-footer {\n padding: 1em;\n background: #f2f2f2;\n border-top: 3px solid #e1e1e1;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n a {\n color: var(--color-link-primary);\n }\n\n a:hover {\n text-decoration: underline;\n color: var(--color-link-primary-hover);\n }\n\n temba-button#reopen-button {\n --button-y: 1px;\n --button-x: 12px;\n }\n\n temba-completion {\n --widget-box-shadow: none;\n --color-widget-border: transparent;\n --widget-box-shadow-focused: none;\n --color-focus: transparent;\n --color-widget-bg-focused: transparent;\n }\n\n .border {\n }\n\n temba-compose {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n }\n `;\n }\n\n @property({ type: String, attribute: 'ticket' })\n ticketUUID: string;\n\n @property({ type: String })\n contactsEndpoint = '/api/v2/contacts.json';\n\n @property({ type: String })\n currentNote = '';\n\n @property({ type: Boolean })\n showDetails = true;\n\n @property({ type: Object })\n currentTicket: Ticket = null;\n\n @property({ type: Object })\n currentContact: Contact = null;\n\n @property({ type: String })\n agent = '';\n\n @property({ type: Boolean })\n blockFetching = false;\n\n @property({ type: String })\n avatar = DEFAULT_AVATAR;\n\n // http promise to monitor for completeness\n public httpComplete: Promise<void>;\n private chat: Chat;\n\n ticket = null;\n lastEventTime = null;\n newestEventTime = null;\n refreshId = null;\n polling = false;\n\n constructor() {\n super();\n }\n\n public firstUpdated(\n changed: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(changed);\n }\n\n public connectedCallback() {\n super.connectedCallback();\n this.chat = this.shadowRoot.querySelector('temba-chat');\n }\n\n public disconnectedCallback() {\n if (this.refreshId) {\n clearInterval(this.refreshId);\n }\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // if we don't have an endpoint infer one\n if (\n changedProperties.has('data') ||\n changedProperties.has('currentContact')\n ) {\n this.currentContact = this.data;\n }\n\n if (changedProperties.has('currentContact')) {\n this.chat = this.shadowRoot.querySelector('temba-chat');\n this.reset();\n this.fetchPreviousMessages();\n }\n }\n\n private reset() {\n if (this.chat) {\n this.chat.reset();\n }\n this.blockFetching = false;\n this.ticket = null;\n this.lastEventTime = null;\n this.newestEventTime = null;\n this.refreshId = null;\n this.polling = false;\n }\n\n public refresh() {\n this.checkForNewMessages();\n }\n\n private handleSend(evt: CustomEvent) {\n const buttonName = evt.detail.name;\n if (buttonName === 'Send') {\n const payload = {\n contact: this.currentContact.uuid\n };\n const compose = evt.currentTarget as Compose;\n if (compose) {\n const text = compose.currentText;\n if (text && text.length > 0) {\n payload['text'] = text;\n }\n const attachments = compose.currentAttachments;\n if (attachments && attachments.length > 0) {\n const attachment_uuids = attachments.map(\n (attachment) => attachment.uuid\n );\n payload['attachments'] = attachment_uuids;\n }\n }\n if (this.currentTicket) {\n payload['ticket'] = this.currentTicket.uuid;\n }\n\n const genericError = buttonName + ' failed, please try again.';\n\n postJSON(`/api/v2/messages.json`, payload)\n .then((response) => {\n if (response.status < 400) {\n this.checkForNewMessages();\n compose.reset();\n this.fireCustomEvent(CustomEventType.MessageSent, { msg: payload });\n } else if (response.status < 500) {\n if (\n response.json.text &&\n response.json.text.length > 0 &&\n response.json.text[0].length > 0\n ) {\n let textError = response.json.text[0];\n textError = textError.replace(\n 'Ensure this field has no more than',\n 'Maximum allowed text is'\n );\n compose.buttonError = textError;\n } else if (\n response.json.attachments &&\n response.json.attachments.length > 0 &&\n response.json.attachments[0].length > 0\n ) {\n let attachmentError = response.json.attachments[0];\n attachmentError = attachmentError\n .replace(\n 'Ensure this field has no more than',\n 'Maximum allowed attachments is'\n )\n .replace('elements', 'files');\n compose.buttonError = attachmentError;\n } else {\n compose.buttonError = genericError;\n }\n } else {\n compose.buttonError = genericError;\n }\n })\n .catch((error) => {\n console.error(error);\n compose.buttonError = genericError;\n });\n }\n }\n\n public render(): TemplateResult {\n const contactHistory = this.currentContact\n ? this.getTembaContactHistory()\n : null;\n const tembaCompose = this.currentContact ? this.getTembaCompose() : null;\n\n const contactHistoryAndChatbox = html`\n <div class=\"chat-wrapper\">${contactHistory} ${tembaCompose}</div>\n `;\n return html`${contactHistoryAndChatbox}`;\n }\n\n private getEndpoint() {\n return `/contact/history/${this.contact}/?_format=json`;\n }\n\n private scheduleRefresh() {\n // knock five seconds off the newest event time so we are\n // a little more aggressive about refreshing short term\n let window = new Date().getTime() - this.newestEventTime / 1000 - 5000;\n\n if (this.refreshId) {\n clearTimeout(this.refreshId);\n this.refreshId = null;\n }\n\n // wait no longer than 15 seconds\n window = Math.min(window, 15000);\n\n // wait at least 2 seconds\n window = Math.max(window, 2000);\n\n this.refreshId = setTimeout(() => {\n this.checkForNewMessages();\n }, window);\n }\n\n public getEventMessage(event: ContactEvent): ChatEvent {\n let message = null;\n switch (event.type) {\n case Events.ERROR:\n case Events.FAILURE:\n message = {\n type: MessageType.Inline,\n text: `Error during flow: ${toTitleCase(\n (event as ErrorMessageEvent).text\n )}`\n };\n break;\n case Events.TICKET_OPENED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'opened')\n };\n break;\n case Events.TICKET_ASSIGNED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAssigned(event as TicketEvent)\n };\n break;\n case Events.TICKET_REOPENED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'reopened')\n };\n break;\n case Events.TICKET_CLOSED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'closed')\n };\n break;\n case Events.TICKET_TOPIC_CHANGED:\n message = {\n type: MessageType.Inline,\n text: `Topic changed to **${(event as TicketEvent).topic.name}**`\n };\n break;\n case Events.FLOW_ENTERED:\n case Events.FLOW_EXITED:\n message = {\n type: MessageType.Inline,\n text: renderFlowEvent(event as FlowEvent)\n };\n break;\n case Events.RUN_RESULT_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderResultEvent(event as UpdateResultEvent)\n };\n break;\n case Events.CONTACT_FIELD_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderUpdateEvent(event as UpdateFieldEvent)\n };\n break;\n case Events.CONTACT_NAME_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderNameChanged(event as NameChangedEvent)\n };\n break;\n case Events.CONTACT_URNS_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactURNsChanged(event as URNsChangedEvent)\n };\n break;\n case Events.EMAIL_SENT:\n message = {\n type: MessageType.Inline,\n text: renderEmailSent(event as EmailSentEvent)\n };\n break;\n case Events.INPUT_LABELS_ADDED:\n message = {\n type: MessageType.Inline,\n text: renderLabelsAdded(event as LabelsAddedEvent)\n };\n break;\n case Events.CONTACT_GROUPS_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactGroupsEvent(event as ContactGroupsEvent)\n };\n break;\n case Events.WEBHOOK_CALLED:\n message = {\n type: MessageType.Inline,\n text: renderWebhookEvent(event as WebhookEvent)\n };\n break;\n case Events.AIRTIME_TRANSFERRED:\n message = {\n type: MessageType.Inline,\n text: renderAirtimeTransferredEvent(event as AirtimeTransferredEvent)\n };\n break;\n case Events.CALL_STARTED:\n message = {\n type: MessageType.Inline,\n text: renderCallStartedEvent()\n };\n break;\n case Events.CAMPAIGN_FIRED:\n message = {\n type: MessageType.Inline,\n text: renderCampaignFiredEvent(event as CampaignFiredEvent)\n };\n break;\n case Events.CHANNEL_EVENT:\n message = {\n type: MessageType.Inline,\n text: renderChannelEvent(event as ChannelEvent)\n };\n break;\n case Events.CONTACT_LANGUAGE_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactLanguageChangedEvent(\n event as ContactLanguageChangedEvent\n )\n };\n break;\n case Events.OPTIN_REQUESTED:\n message = {\n type: MessageType.Inline,\n text: renderOptinRequested(event as OptinRequestedEvent)\n };\n break;\n }\n\n if (message && event.created_on) {\n message.date = new Date(event.created_on);\n } else {\n console.error('Unknown event type', event);\n }\n\n return message;\n }\n\n private getUserForEvent(event: MsgEvent | TicketEvent) {\n let user = null;\n if (event.created_by) {\n const storeUser = this.store.getUser(event.created_by.email);\n if (storeUser) {\n user = {\n email: event.created_by.email,\n name: [storeUser.first_name, storeUser.last_name].join(' '),\n avatar: storeUser.avatar\n };\n }\n } else if (event.type === 'msg_received') {\n user = {\n name: this.currentContact.name\n };\n }\n return user;\n }\n\n private createMessages(page: ContactHistoryPage): ChatEvent[] {\n if (page.events) {\n let messages = [];\n page.events.forEach((event) => {\n const ts = new Date(event.created_on).getTime() * 1000;\n if (ts > this.newestEventTime) {\n this.newestEventTime = ts;\n }\n\n if (event.type === 'ticket_note_added') {\n const ticketEvent = event as TicketEvent;\n messages.push({\n type: MessageType.Note,\n id: event.created_on + event.type,\n user: this.getUserForEvent(ticketEvent),\n date: new Date(ticketEvent.created_on),\n text: ticketEvent.note\n });\n } else if (event.type === 'ticket_opened') {\n // ticket open events can have a note attached\n const ticketEvent = event as TicketEvent;\n messages.push({\n type: MessageType.Note,\n id: event.created_on + event.type + '_note',\n user: this.getUserForEvent(ticketEvent),\n date: new Date(ticketEvent.created_on),\n text: ticketEvent.note\n });\n\n // but the opening of the ticket is a normal event\n messages.push(this.getEventMessage(event));\n } else if (\n event.type === 'msg_created' ||\n event.type === 'msg_received' ||\n event.type === 'broadcast_created'\n ) {\n const msgEvent = event as MsgEvent;\n messages.push({\n type: msgEvent.type === 'msg_received' ? 'msg_in' : 'msg_out',\n id: msgEvent.msg.id + '',\n user: this.getUserForEvent(msgEvent),\n date: new Date(msgEvent.created_on),\n attachments: msgEvent.msg.attachments,\n text: msgEvent.msg.text,\n sendError: msgEvent.status === 'E' || msgEvent.status === 'F',\n popup: html`<div\n style=\"display: flex; flex-direction: row; align-items:center; justify-content: space-between;font-size:0.9em;line-height:1em;min-width:10em\"\n >\n <div style=\"justify-content:left;text-align:left\">\n <temba-date\n value=${msgEvent.created_on}\n display=\"duration\"\n ></temba-date>\n\n ${msgEvent.optin\n ? html`<div style=\"font-size:0.9em;color:#aaa\">\n ${msgEvent.optin.name}\n </div>`\n : null}\n ${msgEvent.failed_reason_display\n ? html`\n <div\n style=\"margin-top:0.2em;margin-right: 0.5em;min-width:10em;max-width:15em;color:var(--color-error);font-size:0.9em\"\n >\n ${msgEvent.failed_reason_display}\n </div>\n `\n : null}\n </div>\n ${msgEvent.logs_url\n ? html`<a style=\"margin-left:0.5em\" href=\"${msgEvent.logs_url}\"\n ><temba-icon name=\"log\"></temba-icon\n ></a>`\n : null}\n </div> `\n });\n } else {\n messages.push(this.getEventMessage(event));\n }\n });\n\n // remove any messages we don't recognize\n messages = messages.filter((msg) => !!msg);\n return messages as ChatEvent[];\n }\n return [];\n }\n\n private checkForNewMessages() {\n // we are already working on it\n if (this.polling) {\n return;\n }\n\n const chat = this.chat;\n const contactChat = this;\n if (this.currentContact && this.newestEventTime) {\n this.polling = true;\n const endpoint = this.getEndpoint();\n\n const fetchContact = this.currentContact.uuid;\n\n fetchContactHistory(\n false,\n endpoint,\n this.currentTicket?.uuid,\n null,\n this.newestEventTime\n ).then((page: ContactHistoryPage) => {\n if (fetchContact === this.currentContact.uuid) {\n this.lastEventTime = page.next_before;\n const messages = this.createMessages(page);\n if (messages.length === 0) {\n contactChat.blockFetching = true;\n }\n messages.reverse();\n chat.addMessages(messages, null, true);\n }\n this.polling = false;\n this.scheduleRefresh();\n });\n }\n }\n\n private fetchPreviousMessages() {\n const chat = this.chat;\n const contactChat = this;\n if (!chat || chat.fetching || contactChat.blockFetching) {\n return;\n }\n\n chat.fetching = true;\n if (this.currentContact) {\n const endpoint = this.getEndpoint();\n fetchContactHistory(\n false,\n endpoint,\n this.currentTicket?.uuid,\n this.lastEventTime\n ).then((page: ContactHistoryPage) => {\n this.lastEventTime = page.next_before;\n const messages = this.createMessages(page);\n messages.reverse();\n\n if (messages.length === 0) {\n contactChat.blockFetching = true;\n }\n chat.addMessages(messages);\n this.scheduleRefresh();\n });\n }\n }\n\n private fetchComplete() {\n this.chat.fetching = false;\n }\n\n private getTembaContactHistory(): TemplateResult {\n return html`<temba-chat\n @temba-scroll-threshold=${this.fetchPreviousMessages}\n @temba-fetch-complete=${this.fetchComplete}\n avatar=${this.avatar}\n agent\n ></temba-chat>`;\n }\n\n private getTembaCompose(): TemplateResult {\n if (this.currentTicket) {\n if (this.currentContact && this.currentContact.status !== 'active') {\n //no chatbox for archived, blocked, or stopped contacts\n return null;\n } else {\n if (!this.currentTicket.closed_on) {\n //chatbox for active contacts with an open ticket\n return this.getCompose();\n } else {\n return null;\n }\n }\n }\n\n if (this.currentContact && this.currentContact.status !== 'active') {\n //no chatbox for archived, blocked, or stopped contacts\n return null;\n } else {\n //chatbox for active contacts\n return this.getCompose();\n }\n }\n\n private getCompose(): TemplateResult {\n return html`<div class=\"border\"></div>\n <div class=\"compose\">\n <temba-compose\n chatbox\n attachments\n counter\n button\n autogrow\n @temba-button-clicked=${this.handleSend.bind(this)}\n >\n </temba-compose>\n </div>`;\n }\n}\n"]}
|
|
@@ -201,7 +201,7 @@ export class ContactTickets extends EndpointMonitorElement {
|
|
|
201
201
|
}
|
|
202
202
|
updated(changes) {
|
|
203
203
|
super.updated(changes);
|
|
204
|
-
if (changes.has('data')) {
|
|
204
|
+
if (changes.has('data') && this.data) {
|
|
205
205
|
this.fireCustomEvent(CustomEventType.DetailsChanged, {
|
|
206
206
|
count: this.data.length
|
|
207
207
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContactTickets.js","sourceRoot":"","sources":["../../../src/contacts/ContactTickets.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { CustomEventType, Ticket, TicketStatus } from '../interfaces';\nimport { EndpointMonitorElement } from '../store/EndpointMonitorElement';\nimport { getClasses, postJSON, stopEvent } from '../utils';\nimport { Icon } from '../vectoricon';\n\nconst dropdownUserScale = 0.7;\nconst inlineUserScale = 0.8;\n\nexport class ContactTickets extends EndpointMonitorElement {\n @property({ type: String })\n agent: string;\n\n @property({ type: String })\n contact: string;\n\n @property({ type: String })\n ticket: string;\n\n @property({ type: Boolean })\n clickable = false;\n\n @property({ type: Boolean })\n expandable = false;\n\n @property({ type: Boolean })\n expanded = false;\n\n @property({ type: Object, attribute: false })\n data: Ticket[];\n\n static get styles() {\n return css`\n :host {\n }\n\n :hover {\n }\n\n .ticket.expandable:hover,\n .ticket.clickable:hover {\n cursor: pointer;\n box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.055),\n 0 0 0px 2px var(--color-link-primary);\n }\n\n .header {\n display: flex;\n flex-direction: row;\n flex-grow: 1;\n }\n\n .tickets {\n display: flex;\n flex-direction: column;\n padding: 0.3em 0.8em;\n }\n\n .count {\n margin-left: 0.5em;\n }\n\n .ticket {\n background: #fff;\n display: flex;\n flex-direction: column;\n margin-bottom: 0.5em;\n border-radius: var(--curvature);\n display: flex;\n flex-direction: column;\n align-items: stretch;\n box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.055),\n 0 0 0px 1px rgba(0, 0, 0, 0.02);\n transition: all 200ms ease-in-out;\n }\n\n .ticket .topic {\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0.5em 0.75em 0.5em 0.75em;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n flex-grow: 2;\n }\n\n .ticket .body {\n max-height: 0px;\n overflow-y: auto;\n -webkit-line-clamp: none;\n white-space: normal;\n width: initial;\n padding: 0.5em 0.75em 0em 0.75em;\n max-height: 40vh;\n display: none;\n margin-bottom: 0.5em;\n border-top: 1px solid #e6e6e6;\n }\n\n .ticket.expanded .body {\n display: block;\n }\n\n .status {\n --icon-color: #999;\n }\n\n .ticket.closed {\n background: #f9f9f9;\n color: #888;\n }\n\n .resolve {\n color: var(--color-primary-dark);\n }\n\n .dropdown {\n color: rgb(45, 45, 45);\n z-index: 50;\n width: 18em;\n }\n\n .option-group {\n padding: 0.4em;\n border-bottom: 1px solid #f3f3f3;\n }\n\n .option-group temba-user {\n flex-grow: 1;\n }\n\n .assigned .user {\n flex-grow: 1;\n }\n\n .assigned {\n display: flex;\n align-items: center;\n }\n\n .assigned temba-button {\n margin-right: 0.75em;\n }\n\n .assigned .user:hover {\n cursor: default;\n background: none;\n }\n\n .options {\n max-height: 40vh;\n overflow-y: auto;\n border-bottom: none;\n }\n\n .user {\n display: flex;\n align-items: center;\n border-radius: var(--curvature);\n cursor: pointer;\n }\n\n .user:hover {\n background: var(--color-selection);\n }\n\n .user .name {\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n flex-grow: 1;\n }\n\n .user temba-button {\n margin-left: 0.5em;\n }\n\n .current-user {\n font-weight: 400;\n }\n\n .details {\n display: flex;\n align-items: center;\n flex-shrink: 1;\n margin-right: 0.5em;\n }\n\n .details .date {\n padding: 0em 0.5em;\n }\n\n .details .toggle {\n padding-right: 0.5em;\n }\n `;\n }\n\n prepareData(data: any): any {\n if (data && data.length) {\n data.sort((a: Ticket, b: Ticket) => {\n if (a.status == TicketStatus.Open && b.status == TicketStatus.Closed) {\n return -1;\n }\n\n if (b.status == TicketStatus.Open && a.status == TicketStatus.Closed) {\n return 1;\n }\n\n if (\n a.status == TicketStatus.Closed &&\n b.status == TicketStatus.Closed\n ) {\n return (\n new Date(b.closed_on).getTime() - new Date(a.closed_on).getTime()\n );\n }\n\n return (\n new Date(b.opened_on).getTime() - new Date(a.opened_on).getTime()\n );\n });\n }\n return data;\n }\n\n protected updated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changes);\n\n if (changes.has('data')) {\n this.fireCustomEvent(CustomEventType.DetailsChanged, {\n count: this.data.length\n });\n }\n\n if (changes.has('contact') || changes.has('ticket')) {\n if (this.contact) {\n this.url = `/api/v2/tickets.json?contact=${this.contact}${\n this.ticket ? '&ticket=' + this.ticket : ''\n }`;\n } else {\n this.url = null;\n }\n }\n }\n\n private handleClose(uuid: string) {\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'close'\n })\n .then(() => {\n this.refresh();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n private handleReopen(uuid: string) {\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'reopen'\n })\n .then(() => {\n this.refresh();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n public handleTicketAssignment(uuid: string, email: string) {\n // if its already assigned to use, it's a noop\n const ticket = this.data.find((ticket) => ticket.uuid === uuid);\n if (ticket.assignee && ticket.assignee.email === email) {\n return;\n }\n this.blur();\n\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'assign',\n assignee: email\n })\n .then(() => {\n this.refresh();\n })\n .catch((response: any) => {\n console.error(response);\n });\n return true;\n }\n\n public renderTicket(ticket: Ticket) {\n const date = ticket.opened_on;\n const users = this.store.getAssignableUsers();\n const agent = users.find((user) => user.email === this.agent);\n return html`\n <div\n @click=${() => {\n if (this.clickable) {\n this.fireCustomEvent(CustomEventType.ButtonClicked, { ticket });\n } else if (this.expandable) {\n this.expanded = !this.expanded;\n }\n }}\n class=\"ticket ${ticket.status} ${getClasses({\n clickable: this.clickable,\n expandable: this.expandable,\n expanded: this.expanded\n })}\"\n >\n <div class=\"header\">\n <div class=\"topic\">${ticket.topic.name}</div>\n\n <div class=\"details\">\n <div class=\"date\">\n <temba-date value=\"${date}\" display=\"duration\"></temba-date>\n </div>\n\n ${ticket.status === TicketStatus.Closed\n ? html`<div class=\"reopen\">\n <temba-button\n primary\n small\n name=\"Reopen\"\n @click=${(event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.handleReopen(ticket.uuid);\n }}\n ></temba-button>\n </div>`\n : html`\n <div>\n <temba-dropdown\n right\n arrowsize=\"8\"\n arrowoffset=\"-44\"\n offsety=\"8\"\n offsetx=${ticket.assignee ? -42 : -28}\n >\n <div slot=\"toggle\" class=\"toggle\">\n ${ticket.assignee\n ? html`\n <temba-user\n email=${ticket.assignee.email}\n scale=\"${inlineUserScale}\"\n ></temba-user>\n `\n : html`\n <temba-button\n name=\"Assign\"\n primary\n small\n ></temba-button>\n `}\n </div>\n\n <div\n slot=\"dropdown\"\n class=\"dropdown\"\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n }}\n >\n ${ticket.assignee\n ? html`\n <div\n class=\"assigned option-group ${agent &&\n ticket.assignee.email == agent.email\n ? 'current-user'\n : ''}\"\n >\n <temba-user\n email=${ticket.assignee.email}\n name\n scale=\"${dropdownUserScale}\"\n ></temba-user>\n <temba-button\n name=\"Unassign\"\n primary\n small\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n this.handleTicketAssignment(\n ticket.uuid,\n null\n );\n }}\n ></temba-button>\n </div>\n `\n : null}\n ${agent &&\n (!ticket.assignee ||\n agent.email !== ticket.assignee.email)\n ? html`\n <div\n class=\"current-user option-group\"\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n this.handleTicketAssignment(\n ticket.uuid,\n agent.email\n );\n }}\n >\n <temba-user\n email=${agent.email}\n name\n scale=\"${dropdownUserScale}\"\n ></temba-user>\n </div>\n `\n : null}\n\n <div class=\"options option-group\">\n ${this.store.getAssignableUsers().map((user) => {\n if (\n ticket.assignee &&\n user.email === ticket.assignee.email\n ) {\n return null;\n }\n\n if (user.email === this.agent) {\n return null;\n }\n return html`<div\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n this.handleTicketAssignment(\n ticket.uuid,\n user.email\n );\n }}\n >\n <temba-user\n email=${user.email}\n scale=\"${dropdownUserScale}\"\n name\n ></temba-user>\n </div>`;\n })}\n </div>\n </div>\n </temba-dropdown>\n </div>\n <temba-tip\n text=\"Resolve\"\n position=\"left\"\n style=\"width:1.5em\"\n class=\"resolve\"\n >\n <temba-icon\n size=\"1.25\"\n name=\"${Icon.check}\"\n @click=${(event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.handleClose(ticket.uuid);\n }}\n ?clickable=${open}\n />\n </temba-tip>\n `}\n </div>\n </div>\n <div class=\"body\">${ticket.body}</div>\n </div>\n `;\n }\n\n public render(): TemplateResult {\n if (this.data && this.data.length > 0) {\n const tickets = this.data.map((ticket) => {\n return this.renderTicket(ticket);\n });\n return html`${tickets}`;\n }\n\n return html`<slot name=\"empty\"></slot>`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ContactTickets.js","sourceRoot":"","sources":["../../../src/contacts/ContactTickets.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { CustomEventType, Ticket, TicketStatus } from '../interfaces';\nimport { EndpointMonitorElement } from '../store/EndpointMonitorElement';\nimport { getClasses, postJSON, stopEvent } from '../utils';\nimport { Icon } from '../vectoricon';\n\nconst dropdownUserScale = 0.7;\nconst inlineUserScale = 0.8;\n\nexport class ContactTickets extends EndpointMonitorElement {\n @property({ type: String })\n agent: string;\n\n @property({ type: String })\n contact: string;\n\n @property({ type: String })\n ticket: string;\n\n @property({ type: Boolean })\n clickable = false;\n\n @property({ type: Boolean })\n expandable = false;\n\n @property({ type: Boolean })\n expanded = false;\n\n @property({ type: Object, attribute: false })\n data: Ticket[];\n\n static get styles() {\n return css`\n :host {\n }\n\n :hover {\n }\n\n .ticket.expandable:hover,\n .ticket.clickable:hover {\n cursor: pointer;\n box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.055),\n 0 0 0px 2px var(--color-link-primary);\n }\n\n .header {\n display: flex;\n flex-direction: row;\n flex-grow: 1;\n }\n\n .tickets {\n display: flex;\n flex-direction: column;\n padding: 0.3em 0.8em;\n }\n\n .count {\n margin-left: 0.5em;\n }\n\n .ticket {\n background: #fff;\n display: flex;\n flex-direction: column;\n margin-bottom: 0.5em;\n border-radius: var(--curvature);\n display: flex;\n flex-direction: column;\n align-items: stretch;\n box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.055),\n 0 0 0px 1px rgba(0, 0, 0, 0.02);\n transition: all 200ms ease-in-out;\n }\n\n .ticket .topic {\n overflow: hidden;\n text-overflow: ellipsis;\n margin: 0.5em 0.75em 0.5em 0.75em;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 1;\n flex-grow: 2;\n }\n\n .ticket .body {\n max-height: 0px;\n overflow-y: auto;\n -webkit-line-clamp: none;\n white-space: normal;\n width: initial;\n padding: 0.5em 0.75em 0em 0.75em;\n max-height: 40vh;\n display: none;\n margin-bottom: 0.5em;\n border-top: 1px solid #e6e6e6;\n }\n\n .ticket.expanded .body {\n display: block;\n }\n\n .status {\n --icon-color: #999;\n }\n\n .ticket.closed {\n background: #f9f9f9;\n color: #888;\n }\n\n .resolve {\n color: var(--color-primary-dark);\n }\n\n .dropdown {\n color: rgb(45, 45, 45);\n z-index: 50;\n width: 18em;\n }\n\n .option-group {\n padding: 0.4em;\n border-bottom: 1px solid #f3f3f3;\n }\n\n .option-group temba-user {\n flex-grow: 1;\n }\n\n .assigned .user {\n flex-grow: 1;\n }\n\n .assigned {\n display: flex;\n align-items: center;\n }\n\n .assigned temba-button {\n margin-right: 0.75em;\n }\n\n .assigned .user:hover {\n cursor: default;\n background: none;\n }\n\n .options {\n max-height: 40vh;\n overflow-y: auto;\n border-bottom: none;\n }\n\n .user {\n display: flex;\n align-items: center;\n border-radius: var(--curvature);\n cursor: pointer;\n }\n\n .user:hover {\n background: var(--color-selection);\n }\n\n .user .name {\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n overflow: hidden;\n flex-grow: 1;\n }\n\n .user temba-button {\n margin-left: 0.5em;\n }\n\n .current-user {\n font-weight: 400;\n }\n\n .details {\n display: flex;\n align-items: center;\n flex-shrink: 1;\n margin-right: 0.5em;\n }\n\n .details .date {\n padding: 0em 0.5em;\n }\n\n .details .toggle {\n padding-right: 0.5em;\n }\n `;\n }\n\n prepareData(data: any): any {\n if (data && data.length) {\n data.sort((a: Ticket, b: Ticket) => {\n if (a.status == TicketStatus.Open && b.status == TicketStatus.Closed) {\n return -1;\n }\n\n if (b.status == TicketStatus.Open && a.status == TicketStatus.Closed) {\n return 1;\n }\n\n if (\n a.status == TicketStatus.Closed &&\n b.status == TicketStatus.Closed\n ) {\n return (\n new Date(b.closed_on).getTime() - new Date(a.closed_on).getTime()\n );\n }\n\n return (\n new Date(b.opened_on).getTime() - new Date(a.opened_on).getTime()\n );\n });\n }\n return data;\n }\n\n protected updated(\n changes: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.updated(changes);\n\n if (changes.has('data') && this.data) {\n this.fireCustomEvent(CustomEventType.DetailsChanged, {\n count: this.data.length\n });\n }\n\n if (changes.has('contact') || changes.has('ticket')) {\n if (this.contact) {\n this.url = `/api/v2/tickets.json?contact=${this.contact}${\n this.ticket ? '&ticket=' + this.ticket : ''\n }`;\n } else {\n this.url = null;\n }\n }\n }\n\n private handleClose(uuid: string) {\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'close'\n })\n .then(() => {\n this.refresh();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n private handleReopen(uuid: string) {\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'reopen'\n })\n .then(() => {\n this.refresh();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n public handleTicketAssignment(uuid: string, email: string) {\n // if its already assigned to use, it's a noop\n const ticket = this.data.find((ticket) => ticket.uuid === uuid);\n if (ticket.assignee && ticket.assignee.email === email) {\n return;\n }\n this.blur();\n\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'assign',\n assignee: email\n })\n .then(() => {\n this.refresh();\n })\n .catch((response: any) => {\n console.error(response);\n });\n return true;\n }\n\n public renderTicket(ticket: Ticket) {\n const date = ticket.opened_on;\n const users = this.store.getAssignableUsers();\n const agent = users.find((user) => user.email === this.agent);\n return html`\n <div\n @click=${() => {\n if (this.clickable) {\n this.fireCustomEvent(CustomEventType.ButtonClicked, { ticket });\n } else if (this.expandable) {\n this.expanded = !this.expanded;\n }\n }}\n class=\"ticket ${ticket.status} ${getClasses({\n clickable: this.clickable,\n expandable: this.expandable,\n expanded: this.expanded\n })}\"\n >\n <div class=\"header\">\n <div class=\"topic\">${ticket.topic.name}</div>\n\n <div class=\"details\">\n <div class=\"date\">\n <temba-date value=\"${date}\" display=\"duration\"></temba-date>\n </div>\n\n ${ticket.status === TicketStatus.Closed\n ? html`<div class=\"reopen\">\n <temba-button\n primary\n small\n name=\"Reopen\"\n @click=${(event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.handleReopen(ticket.uuid);\n }}\n ></temba-button>\n </div>`\n : html`\n <div>\n <temba-dropdown\n right\n arrowsize=\"8\"\n arrowoffset=\"-44\"\n offsety=\"8\"\n offsetx=${ticket.assignee ? -42 : -28}\n >\n <div slot=\"toggle\" class=\"toggle\">\n ${ticket.assignee\n ? html`\n <temba-user\n email=${ticket.assignee.email}\n scale=\"${inlineUserScale}\"\n ></temba-user>\n `\n : html`\n <temba-button\n name=\"Assign\"\n primary\n small\n ></temba-button>\n `}\n </div>\n\n <div\n slot=\"dropdown\"\n class=\"dropdown\"\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n }}\n >\n ${ticket.assignee\n ? html`\n <div\n class=\"assigned option-group ${agent &&\n ticket.assignee.email == agent.email\n ? 'current-user'\n : ''}\"\n >\n <temba-user\n email=${ticket.assignee.email}\n name\n scale=\"${dropdownUserScale}\"\n ></temba-user>\n <temba-button\n name=\"Unassign\"\n primary\n small\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n this.handleTicketAssignment(\n ticket.uuid,\n null\n );\n }}\n ></temba-button>\n </div>\n `\n : null}\n ${agent &&\n (!ticket.assignee ||\n agent.email !== ticket.assignee.email)\n ? html`\n <div\n class=\"current-user option-group\"\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n this.handleTicketAssignment(\n ticket.uuid,\n agent.email\n );\n }}\n >\n <temba-user\n email=${agent.email}\n name\n scale=\"${dropdownUserScale}\"\n ></temba-user>\n </div>\n `\n : null}\n\n <div class=\"options option-group\">\n ${this.store.getAssignableUsers().map((user) => {\n if (\n ticket.assignee &&\n user.email === ticket.assignee.email\n ) {\n return null;\n }\n\n if (user.email === this.agent) {\n return null;\n }\n return html`<div\n @click=${(event: MouseEvent) => {\n stopEvent(event);\n this.handleTicketAssignment(\n ticket.uuid,\n user.email\n );\n }}\n >\n <temba-user\n email=${user.email}\n scale=\"${dropdownUserScale}\"\n name\n ></temba-user>\n </div>`;\n })}\n </div>\n </div>\n </temba-dropdown>\n </div>\n <temba-tip\n text=\"Resolve\"\n position=\"left\"\n style=\"width:1.5em\"\n class=\"resolve\"\n >\n <temba-icon\n size=\"1.25\"\n name=\"${Icon.check}\"\n @click=${(event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.handleClose(ticket.uuid);\n }}\n ?clickable=${open}\n />\n </temba-tip>\n `}\n </div>\n </div>\n <div class=\"body\">${ticket.body}</div>\n </div>\n `;\n }\n\n public render(): TemplateResult {\n if (this.data && this.data.length > 0) {\n const tickets = this.data.map((ticket) => {\n return this.renderTicket(ticket);\n });\n return html`${tickets}`;\n }\n\n return html`<slot name=\"empty\"></slot>`;\n }\n}\n"]}
|