@nyaruka/temba-components 0.114.1 → 0.117.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 +14 -0
- package/dist/temba-components.js +329 -311
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/button/Button.js +5 -0
- package/out-tsc/src/button/Button.js.map +1 -1
- package/out-tsc/src/chat/Chat.js +5 -1
- package/out-tsc/src/chat/Chat.js.map +1 -1
- package/out-tsc/src/contacts/ContactChat.js +27 -16
- package/out-tsc/src/contacts/ContactChat.js.map +1 -1
- package/out-tsc/src/dropdown/Dropdown.js +1 -1
- package/out-tsc/src/dropdown/Dropdown.js.map +1 -1
- package/out-tsc/src/list/TembaList.js +3 -2
- package/out-tsc/src/list/TembaList.js.map +1 -1
- package/out-tsc/src/list/TembaMenu.js +17 -5
- package/out-tsc/src/list/TembaMenu.js.map +1 -1
- package/out-tsc/src/options/Options.js +17 -17
- package/out-tsc/src/options/Options.js.map +1 -1
- package/out-tsc/src/select/Select.js +6 -2
- package/out-tsc/src/select/Select.js.map +1 -1
- package/out-tsc/src/select/UserSelect.js +0 -1
- package/out-tsc/src/select/UserSelect.js.map +1 -1
- package/out-tsc/src/select/WorkspaceSelect.js +65 -0
- package/out-tsc/src/select/WorkspaceSelect.js.map +1 -0
- package/out-tsc/src/store/Store.js +3 -1
- package/out-tsc/src/store/Store.js.map +1 -1
- package/out-tsc/src/user/TembaUser.js +27 -11
- package/out-tsc/src/user/TembaUser.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-contact-chat.test.js +1 -0
- package/out-tsc/test/temba-contact-chat.test.js.map +1 -1
- package/package.json +1 -1
- package/screenshots/truth/contacts/chat-for-archived-contact.png +0 -0
- package/screenshots/truth/contacts/chat-for-blocked-contact.png +0 -0
- package/screenshots/truth/contacts/chat-for-stopped-contact.png +0 -0
- package/screenshots/truth/select/expressions.png +0 -0
- package/screenshots/truth/select/functions.png +0 -0
- package/src/button/Button.ts +5 -0
- package/src/chat/Chat.ts +5 -1
- package/src/contacts/ContactChat.ts +30 -20
- package/src/dropdown/Dropdown.ts +1 -1
- package/src/list/TembaList.ts +3 -6
- package/src/list/TembaMenu.ts +20 -5
- package/src/options/Options.ts +18 -18
- package/src/select/Select.ts +5 -2
- package/src/select/UserSelect.ts +0 -1
- package/src/select/WorkspaceSelect.ts +71 -0
- package/src/store/Store.ts +3 -1
- package/src/user/TembaUser.ts +23 -10
- package/temba-modules.ts +2 -0
- package/test/temba-contact-chat.test.ts +5 -0
|
@@ -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 { fetchResults, oxford, oxfordFn, postJSON } from '../utils';\nimport { ContactStoreElement } from './ContactStoreElement';\nimport { Compose, ComposeValue } 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';\nimport { UserSelect } from '../select/UserSelect';\nimport { Select } from '../select/Select';\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 border-top: 1px inset rgba(0, 0, 0, 0.05);\n\n\n }\n\n .chat-wrapper {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n min-height: 0;\n background: #f9f9f9;\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 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 {\n margin: 0.1em 0.25em;\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 --temba-tabs-options-padding: 0.5em 0.5em 0 0.5em;\n --temba-tabs-border-left: none;\n --temba-tabs-border-right: none;\n --temba-tabs-border-bottom: none;\n }\n\n .error-gutter {\n display: flex;\n padding: 0.5em 1em;\n background: #f9f9f9;\n item-align: center;\n }\n\n .error-message {\n color: var(--color-error);\n padding-right: 1em;\n flex-grow: 1;\n align-self: center;\n }\n\n temba-chat {\n border-bottom: 1px solid #ddd;\n background: linear-gradient(0deg, #fff, #fff);\n --chat-border-in: 1px solid #eee;\n --color-chat-out: var(--color-message)\n );\n }\n\n .action-bar {\n }\n\n .in-flow {\n border-radius: 0.8em;\n align-items: center;\n background: #666;\n padding: 0.5em 1em;\n margin: 1em;\n margin-right: 2em;\n display: inline-flex;\n opacity: 0.9;\n }\n\n .in-flow:hover {\n opacity: 1;\n }\n\n .in-flow .flow-name {\n display: flex;\n color: #fff;\n }\n\n .in-flow a {\n font-weight: bold;\n color: #fff;\n }\n\n .in-flow .interrupt-button {\n margin-left: 1em;\n }\n\n .in-flow .interrupt {\n text-align: center;\n align-self: stretch;\n display: flex;\n align-items: center;\n cursor: pointer;\n justify-content: center;\n padding: 0.5em 1em;\n font-weight: bold;\n }\n\n .in-flow .interrupt:hover {\n background: rgba(var(--error-rgb), 0.92);\n }\n\n .in-flow temba-icon,\n .in-ticket temba-icon {\n margin-right: 0.5em;\n }\n\n .in-ticket-wrapper {\n }\n\n .in-ticket {\n box-shadow: none;\n padding: 0.5em 0.5em;\n text-align: center;\n align-items: center;\n border-bottom: 1px solid #ddd;\n display: flex;\n box-shadow: none;\n margin: 0em;\n background: rgba(0, 0, 0, 0.03);\n }\n\n temba-user {\n border: 1px solid #ddd;\n padding: 0.2em 0.5em;\n border-radius: var(--curvature);\n min-width: 10em;\n background: #fff;\n }\n\n temba-user:hover {\n border: 1px solid #ddd;\n background: #f9f9f9;\n }\n\n .assign-button {\n --button-mask: #ebebeb;\n color: #333;\n margin: 0.25em;\n }\n\n temba-user-select {\n width: 250px;\n }\n\n temba-button {\n --button-border: 1px solid #ddd;\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: Boolean })\n showInterrupt = false;\n\n @property({ type: String })\n avatar = DEFAULT_AVATAR;\n\n @property({ type: String })\n errorMessage: string;\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 super.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 if (changedProperties.has('currentTicket')) {\n const users = this.shadowRoot.querySelector(\n 'temba-user-select'\n ) as UserSelect;\n if (users) {\n users.setValues(\n this.currentTicket?.assignee ? [this.currentTicket?.assignee] : []\n );\n }\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 this.errorMessage = null;\n\n const compose = this.shadowRoot.querySelector('temba-compose') as Compose;\n if (compose) {\n compose.reset();\n }\n }\n\n private handleInterrupt() {\n this.fireCustomEvent(CustomEventType.Interrupt, {\n contact: this.currentContact\n });\n }\n\n private handleRetry() {\n const compose = this.shadowRoot.querySelector('temba-compose') as Compose;\n compose.triggerSend();\n }\n\n private handleSend(evt: CustomEvent) {\n this.errorMessage = null;\n const composeEle = evt.currentTarget as Compose;\n const compose = evt.detail.langValues['und'] as ComposeValue;\n\n const payload = {\n contact: this.currentContact.uuid\n };\n\n const text = compose.text;\n if (text && text.length > 0) {\n payload['text'] = text;\n }\n const attachments = compose.attachments;\n if (attachments && attachments.length > 0) {\n const attachment_uuids = attachments.map((attachment) => attachment.uuid);\n payload['attachments'] = attachment_uuids;\n }\n\n if (this.currentTicket) {\n payload['ticket'] = this.currentTicket.uuid;\n }\n\n const genericError = 'Send failed, please try again.';\n postJSON(`/api/v2/messages.json`, payload)\n .then((response) => {\n if (response.status < 400) {\n this.checkForNewMessages();\n composeEle.reset();\n this.fireCustomEvent(CustomEventType.MessageSent, { msg: payload });\n } else {\n this.errorMessage = genericError;\n }\n })\n .catch(() => {\n this.errorMessage = genericError;\n });\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.type === 'msg_received') {\n user = {\n name: this.currentContact.name\n };\n } else if (event.created_by) {\n user = {\n email: event.created_by.email,\n name: `${event.created_by.first_name} ${event.created_by.last_name}`.trim(),\n avatar: event.created_by.avatar\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 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 attachments\n counter\n autogrow\n shortcuts\n ?embeddedTabs=${!this.currentTicket}\n @temba-submitted=${this.handleSend.bind(this)}\n >\n </temba-compose>\n ${this.errorMessage\n ? html` <div class=\"error-gutter\">\n <div class=\"error-message\">${this.errorMessage}</div>\n <temba-button\n name=\"Retry\"\n @click=${this.handleRetry}\n ></temba-button>\n </div>`\n : null}\n </div>`;\n }\n\n private handleAssignmentChanged(evt: CustomEvent) {\n const users = evt.currentTarget as UserSelect;\n const assignee = users.values[0];\n this.assignTicket(assignee ? assignee.email : null);\n users.blur();\n }\n\n private handleTopicChanged(evt: CustomEvent) {\n const select = evt.target as Select<any>;\n const topic = select.values[0];\n\n if (this.currentTicket.topic.uuid !== topic.uuid) {\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [this.currentTicket.uuid],\n action: 'change_topic',\n topic: topic.uuid\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n }\n\n public assignTicket(email: string) {\n // if its already assigned to use, it's a noop\n if (\n (this.currentTicket.assignee &&\n this.currentTicket.assignee.email === email) ||\n (this.currentTicket.assignee === null && email === null)\n ) {\n return;\n }\n\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [this.currentTicket.uuid],\n action: 'assign',\n assignee: email\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n return true;\n }\n\n public refreshTicket() {\n if (this.currentTicket) {\n fetchResults(`/api/v2/tickets.json?uuid=${this.currentTicket.uuid}`).then(\n (values) => {\n if (values.length > 0) {\n this.fireCustomEvent(CustomEventType.TicketUpdated, {\n ticket: values[0],\n previous: this.currentTicket\n });\n this.currentTicket = values[0];\n }\n }\n );\n }\n }\n\n private handleReopen() {\n const uuid = this.currentTicket.uuid;\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'reopen'\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n private handleClose() {\n const uuid = this.currentTicket.uuid;\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'close'\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n public render(): TemplateResult {\n const inFlow = this.currentContact && this.currentContact.flow;\n\n const inTicket = this.currentTicket;\n const ticketClosed = this.currentTicket && this.currentTicket.closed_on;\n\n return html`<div class=\"chat-wrapper\">\n ${this.currentContact\n ? html`<temba-chat\n @temba-scroll-threshold=${this.fetchPreviousMessages}\n @temba-fetch-complete=${this.fetchComplete}\n avatar=${this.avatar}\n agent\n >\n ${inFlow\n ? html`\n <div slot=\"footer\" style=\"text-align:center;\">\n <div class=\"in-flow\">\n <div class=\"flow-name\">\n <temba-icon name=\"flow\" size=\"1.2\"></temba-icon>\n <div>\n Currently in\n <a\n href=\"/flow/editor/${this.currentContact.flow\n .uuid}/\"\n >${this.currentContact.flow.name}</a\n >\n </div>\n </div>\n ${this.showInterrupt\n ? html`<temba-button\n class=\"interrupt-button\"\n destructive\n small\n @click=${this.handleInterrupt}\n name=\"Interrupt\"\n >\n </temba-button>`\n : null}\n </div>\n </div>\n `\n : null}\n <div slot=\"footer\"></div>\n </temba-chat>\n ${inTicket\n ? html`<div class=\"in-ticket-wrapper\">\n <div class=\"in-ticket\">\n <temba-user-select\n placeholder=\"Assign to..\"\n searchable\n searchOnFocus\n clearable\n .values=${this.currentTicket.assignee\n ? [this.currentTicket.assignee]\n : []}\n @change=${this.handleAssignmentChanged}\n ?disabled=${ticketClosed}\n ></temba-user-select>\n\n <temba-select\n style=\"margin:0 0.5em; flex-grow:1\"\n endpoint=\"/api/v2/topics.json\"\n searchable\n valuekey=\"uuid\"\n .values=${[this.currentTicket.topic]}\n @change=${this.handleTopicChanged}\n ?disabled=${ticketClosed}\n ></temba-select>\n\n ${this.currentTicket.closed_on\n ? html`\n <temba-button\n name=\"Reopen\"\n @click=${this.handleReopen}\n ></temba-button>\n `\n : html`\n <temba-button\n name=\"Close\"\n destructive\n @click=${this.handleClose}\n ></temba-button>\n `}\n </div>\n </div> `\n : null}\n ${this.getTembaCompose()}`\n : null}\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 { fetchResults, oxford, oxfordFn, postJSON } from '../utils';\nimport { ContactStoreElement } from './ContactStoreElement';\nimport { Compose, ComposeValue } 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';\nimport { UserSelect } from '../select/UserSelect';\nimport { Select } from '../select/Select';\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 border-top: 1px inset rgba(0, 0, 0, 0.05);\n\n\n }\n\n .chat-wrapper {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n min-height: 0;\n background: #f9f9f9;\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 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 {\n margin: 0.1em 0.25em;\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 --temba-tabs-options-padding: 0.5em 0.5em 0 0.5em;\n --temba-tabs-border-left: none;\n --temba-tabs-border-right: none;\n --temba-tabs-border-bottom: none;\n }\n\n .error-gutter {\n display: flex;\n padding: 0.5em 1em;\n background: #f9f9f9;\n item-align: center;\n }\n\n .error-message {\n color: var(--color-error);\n padding-right: 1em;\n flex-grow: 1;\n align-self: center;\n }\n\n temba-chat {\n border-bottom: 1px solid #ddd;\n background: linear-gradient(0deg, #fff, #fff);\n --chat-border-in: 1px solid #eee;\n --color-chat-out: var(--color-message)\n );\n }\n\n .action-bar {\n }\n\n .in-flow {\n border-radius: 0.8em;\n align-items: center;\n background: #666;\n padding: 0.5em 1em;\n margin: 1em;\n margin-right: 2em;\n display: inline-flex;\n opacity: 0.9;\n }\n\n .in-flow:hover {\n opacity: 1;\n }\n\n .in-flow .flow-name {\n display: flex;\n color: #fff;\n }\n\n .in-flow a {\n font-weight: bold;\n color: #fff;\n }\n\n .in-flow .interrupt-button {\n margin-left: 1em;\n }\n\n .in-flow .interrupt {\n text-align: center;\n align-self: stretch;\n display: flex;\n align-items: center;\n cursor: pointer;\n justify-content: center;\n padding: 0.5em 1em;\n font-weight: bold;\n }\n\n .in-flow .interrupt:hover {\n background: rgba(var(--error-rgb), 0.92);\n }\n\n .in-flow temba-icon,\n .in-ticket temba-icon {\n margin-right: 0.5em;\n }\n\n .in-ticket-wrapper {\n }\n\n .in-ticket {\n box-shadow: none;\n padding: 0.5em 0.5em;\n text-align: center;\n align-items: center;\n border-bottom: 1px solid #ddd;\n display: flex;\n box-shadow: none;\n margin: 0em;\n background: rgba(0, 0, 0, 0.03);\n }\n\n temba-user {\n border: 1px solid #ddd;\n padding: 0.2em 0.5em;\n border-radius: var(--curvature);\n min-width: 10em;\n background: #fff;\n }\n\n temba-user:hover {\n border: 1px solid #ddd;\n background: #f9f9f9;\n }\n\n .assign-button {\n --button-mask: #ebebeb;\n color: #333;\n margin: 0.25em;\n }\n\n temba-user-select {\n width: 250px;\n }\n\n temba-button {\n --button-border: 1px solid #ddd;\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: Boolean })\n showInterrupt = false;\n\n @property({ type: String })\n avatar = DEFAULT_AVATAR;\n\n @property({ type: String })\n errorMessage: string;\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 super.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 // unschedule any previous refreshes\n if (this.refreshId) {\n clearTimeout(this.refreshId);\n this.refreshId = null;\n }\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 this.errorMessage = null;\n\n const compose = this.shadowRoot.querySelector('temba-compose') as Compose;\n if (compose) {\n compose.reset();\n }\n }\n\n private handleInterrupt() {\n this.fireCustomEvent(CustomEventType.Interrupt, {\n contact: this.currentContact\n });\n }\n\n private handleRetry() {\n const compose = this.shadowRoot.querySelector('temba-compose') as Compose;\n compose.triggerSend();\n }\n\n private handleSend(evt: CustomEvent) {\n this.errorMessage = null;\n const composeEle = evt.currentTarget as Compose;\n const compose = evt.detail.langValues['und'] as ComposeValue;\n\n const payload = {\n contact: this.currentContact.uuid\n };\n\n const text = compose.text;\n if (text && text.length > 0) {\n payload['text'] = text;\n }\n const attachments = compose.attachments;\n if (attachments && attachments.length > 0) {\n const attachment_uuids = attachments.map((attachment) => attachment.uuid);\n payload['attachments'] = attachment_uuids;\n }\n\n if (this.currentTicket) {\n payload['ticket'] = this.currentTicket.uuid;\n }\n\n const genericError = 'Send failed, please try again.';\n postJSON(`/api/v2/messages.json`, payload)\n .then((response) => {\n if (response.status < 400) {\n this.checkForNewMessages();\n composeEle.reset();\n this.fireCustomEvent(CustomEventType.MessageSent, { msg: payload });\n } else {\n this.errorMessage = genericError;\n }\n })\n .catch(() => {\n this.errorMessage = genericError;\n });\n }\n\n private getEndpoint() {\n if (this.contact) {\n return `/contact/history/${this.contact}/?_format=json`;\n }\n return null;\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.type === 'msg_received') {\n user = {\n name: this.currentContact.name\n };\n } else if (event.created_by) {\n user = {\n email: event.created_by.email,\n name: `${event.created_by.first_name} ${event.created_by.last_name}`.trim(),\n avatar: event.created_by.avatar\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 if (!endpoint) {\n return;\n }\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 if (!endpoint) {\n return;\n }\n\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 if (this.chat) {\n this.chat.fetching = false;\n }\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 attachments\n counter\n autogrow\n shortcuts\n ?embeddedTabs=${!this.currentTicket}\n @temba-submitted=${this.handleSend.bind(this)}\n >\n </temba-compose>\n ${this.errorMessage\n ? html` <div class=\"error-gutter\">\n <div class=\"error-message\">${this.errorMessage}</div>\n <temba-button\n name=\"Retry\"\n @click=${this.handleRetry}\n ></temba-button>\n </div>`\n : null}\n </div>`;\n }\n\n private handleAssignmentChanged(evt: CustomEvent) {\n const users = evt.currentTarget as UserSelect;\n const assignee = users.values[0];\n\n this.assignTicket(assignee ? assignee.email : null);\n users.blur();\n }\n\n private handleTopicChanged(evt: CustomEvent) {\n const select = evt.target as Select<any>;\n const topic = select.values[0];\n\n if (this.currentTicket.topic.uuid !== topic.uuid) {\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [this.currentTicket.uuid],\n action: 'change_topic',\n topic: topic.uuid\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n }\n\n public assignTicket(email: string) {\n // if its already assigned to use, it's a noop\n if (\n (this.currentTicket.assignee &&\n this.currentTicket.assignee.email === email) ||\n (this.currentTicket.assignee === null && email === null)\n ) {\n return;\n }\n\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [this.currentTicket.uuid],\n action: 'assign',\n assignee: email\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n return true;\n }\n\n public refreshTicket() {\n if (this.currentTicket) {\n fetchResults(`/api/v2/tickets.json?uuid=${this.currentTicket.uuid}`).then(\n (values) => {\n this.store.resolveUsers(values, ['assignee']).then(() => {\n if (values.length > 0) {\n this.fireCustomEvent(CustomEventType.TicketUpdated, {\n ticket: values[0],\n previous: this.currentTicket\n });\n this.currentTicket = values[0];\n }\n });\n }\n );\n }\n }\n\n private handleReopen() {\n const uuid = this.currentTicket.uuid;\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'reopen'\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n private handleClose() {\n const uuid = this.currentTicket.uuid;\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'close'\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n public render(): TemplateResult {\n const inFlow = this.currentContact && this.currentContact.flow;\n\n const inTicket = this.currentTicket;\n const ticketClosed = this.currentTicket && this.currentTicket.closed_on;\n\n return html`<div class=\"chat-wrapper\">\n ${this.currentContact\n ? html`<temba-chat\n @temba-scroll-threshold=${this.fetchPreviousMessages}\n @temba-fetch-complete=${this.fetchComplete}\n avatar=${this.avatar}\n agent\n >\n ${inFlow\n ? html`\n <div slot=\"footer\" style=\"text-align:center;\">\n <div class=\"in-flow\">\n <div class=\"flow-name\">\n <temba-icon name=\"flow\" size=\"1.2\"></temba-icon>\n <div>\n Currently in\n <a\n href=\"/flow/editor/${this.currentContact.flow\n .uuid}/\"\n >${this.currentContact.flow.name}</a\n >\n </div>\n </div>\n ${this.showInterrupt\n ? html`<temba-button\n class=\"interrupt-button\"\n destructive\n small\n @click=${this.handleInterrupt}\n name=\"Interrupt\"\n >\n </temba-button>`\n : null}\n </div>\n </div>\n `\n : null}\n <div slot=\"footer\"></div>\n </temba-chat>\n ${inTicket\n ? html`<div class=\"in-ticket-wrapper\">\n <div class=\"in-ticket\">\n <temba-user-select\n placeholder=\"Assign to..\"\n searchable\n searchOnFocus\n clearable\n .values=${this.currentTicket.assignee\n ? [this.currentTicket.assignee]\n : []}\n @change=${this.handleAssignmentChanged}\n ?disabled=${ticketClosed}\n ></temba-user-select>\n\n <temba-select\n style=\"margin:0 0.5em; flex-grow:1\"\n endpoint=\"/api/v2/topics.json\"\n searchable\n valuekey=\"uuid\"\n .values=${[this.currentTicket.topic]}\n @change=${this.handleTopicChanged}\n ?disabled=${ticketClosed}\n ></temba-select>\n\n ${this.currentTicket.closed_on\n ? html`\n <temba-button\n name=\"Reopen\"\n @click=${this.handleReopen}\n ></temba-button>\n `\n : html`\n <temba-button\n name=\"Close\"\n destructive\n @click=${this.handleClose}\n ></temba-button>\n `}\n </div>\n </div> `\n : null}\n ${this.getTembaCompose()}`\n : null}\n </div>`;\n }\n}\n"]}
|
|
@@ -36,7 +36,7 @@ export class Dropdown extends RapidElement {
|
|
|
36
36
|
z-index: 2;
|
|
37
37
|
padding: 0;
|
|
38
38
|
opacity: 0;
|
|
39
|
-
border-radius: var(--curvature);
|
|
39
|
+
border-radius: calc(var(--curvature) * 1.5);
|
|
40
40
|
background: #fff;
|
|
41
41
|
transition: all calc(0.8 * var(--transition-speed)) var(--bounce);
|
|
42
42
|
user-select: none;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../../../src/dropdown/Dropdown.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { RapidElement } from '../RapidElement';\nimport { getClasses } from '../utils';\nimport { CustomEventType } from '../interfaces';\n\nimport { styleMap } from 'lit-html/directives/style-map.js';\n\nexport class Dropdown extends RapidElement {\n static get styles() {\n return css`\n :host {\n }\n\n .wrapper {\n position: relative;\n }\n\n .toggle {\n cursor: pointer;\n }\n\n .dropdown-wrapper {\n position: relative;\n overflow: auto;\n }\n\n .dropdown:focus {\n }\n\n .dropdown.dormant {\n pointer-events: none;\n }\n\n .dropdown {\n position: fixed;\n z-index: 2;\n padding: 0;\n opacity: 0;\n border-radius: var(--curvature);\n background: #fff;\n transition: all calc(0.8 * var(--transition-speed)) var(--bounce);\n user-select: none;\n margin-top: 0px;\n margin-left: 0px;\n box-shadow: var(--dropdown-shadow);\n }\n\n .dropdown:focus {\n outline: none;\n }\n\n .arrow {\n content: '';\n width: 0px;\n height: 0;\n top: -6px;\n z-index: 10;\n position: absolute;\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 6px solid white;\n }\n\n .open .dropdown {\n opacity: 1;\n pointer-events: auto;\n transform: translateY(0.5em) scale(1);\n }\n\n .mask {\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n opacity: 0.5;\n transition: opacity var(--transition-speed) ease-in-out;\n pointer-events: none;\n z-index: 1;\n }\n\n .mask.open {\n opacity: 1;\n pointer-events: auto;\n }\n\n .right {\n right: 0;\n }\n `;\n }\n\n @property({ type: Boolean })\n open = false;\n\n @property({ type: Boolean })\n dormant = true;\n\n @property({ type: Number })\n arrowSize = 8;\n\n @property({ type: Number })\n margin = 10;\n\n @property({ type: Boolean })\n mask = false;\n\n @property({ type: Object, attribute: false })\n dropdownStyle = {};\n\n @property({ type: Object, attribute: false })\n arrowStyle = {};\n\n constructor() {\n super();\n this.calculatePosition = this.calculatePosition.bind(this);\n }\n\n private activeFocus: any;\n private blurHandler: any;\n\n public firstUpdated(props: any) {\n super.firstUpdated(props);\n this.resetBlurHandler();\n }\n\n private resetBlurHandler() {\n const dropdown = this.shadowRoot.querySelector(\n '.dropdown'\n ) as HTMLDivElement;\n\n if (this.activeFocus) {\n this.activeFocus.removeEventListener('blur', this.blurHandler);\n }\n\n this.activeFocus = dropdown;\n this.blurHandler = this.handleBlur.bind(this);\n\n this.activeFocus.addEventListener('blur', this.blurHandler);\n }\n\n private handleBlur(event: FocusEvent) {\n const newTarget = event.relatedTarget as any;\n\n if (this.contains(newTarget)) {\n newTarget.addEventListener('blur', this.blurHandler);\n this.activeFocus = newTarget;\n } else {\n this.closeDropdown();\n }\n }\n\n private openDropdown() {\n this.open = true;\n this.dormant = false;\n this.resetBlurHandler();\n\n const dropdown = this.shadowRoot.querySelector(\n '.dropdown'\n ) as HTMLDivElement;\n dropdown.focus();\n dropdown.click();\n\n this.fireCustomEvent(CustomEventType.Opened);\n }\n\n private closeDropdown() {\n this.activeFocus.removeEventListener('blur', this.blurHandler);\n\n this.open = false;\n this.resetBlurHandler();\n\n window.setTimeout(() => {\n this.dormant = true;\n }, 250);\n\n this.blur();\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n if (changedProperties.has('open')) {\n this.dropdownStyle = {};\n }\n\n if (changedProperties.has('dropdownStyle')) {\n if (Object.keys(this.dropdownStyle).length === 0) {\n this.calculatePosition();\n }\n }\n }\n\n public calculatePosition() {\n const dropdown = this.shadowRoot.querySelector(\n '.dropdown'\n ) as HTMLDivElement;\n const toggle = this.querySelector('div[slot=\"toggle\"]');\n\n const arrow = this.shadowRoot.querySelector('.arrow') as HTMLDivElement;\n\n let bumpedUp = false;\n let bumpedLeft = false;\n\n if (dropdown && toggle) {\n const dropdownBounds = dropdown.getBoundingClientRect();\n const toggleBounds = toggle.getBoundingClientRect();\n const arrowBounds = arrow.getBoundingClientRect();\n\n if (!toggle) {\n return;\n }\n\n const dropdownStyle = {\n border: '1px solid rgba(0,0,0,0.1)',\n marginTop: '0.5em'\n };\n\n // if off the the right, bump it left\n if (dropdownBounds.right > window.innerWidth) {\n dropdownStyle['left'] =\n toggleBounds.right - dropdownBounds.width + 'px';\n delete dropdownStyle['right'];\n bumpedLeft = true;\n }\n\n // if off to the bottom, bump it up\n if (dropdownBounds.bottom > window.innerHeight) {\n dropdownStyle['top'] = toggleBounds.top - dropdownBounds.height + 'px';\n dropdownStyle['margin-top'] = '-0.5em';\n bumpedUp = true;\n }\n\n const arrowStyle = {\n left: toggleBounds.width / 2 - arrowBounds.width / 2 + 'px',\n borderWidth: this.arrowSize + 'px',\n top: '-' + this.arrowSize + 'px'\n };\n\n if (bumpedUp) {\n // rotate our arrow 180 degrees\n arrowStyle['transform'] = 'rotate(180deg)';\n\n // and place it at the bottom of the dropdown\n arrowStyle['top'] = 'auto';\n arrowStyle['bottom'] = '-' + this.arrowSize + 'px';\n }\n\n if (bumpedLeft) {\n arrowStyle['right'] =\n toggleBounds.width / 2 - arrowBounds.width / 2 + 'px';\n delete arrowStyle['left'];\n }\n\n this.arrowStyle = arrowStyle;\n this.dropdownStyle = dropdownStyle;\n }\n this.requestUpdate();\n }\n\n public handleToggleClicked(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n if (!this.open && this.dormant) {\n this.openDropdown();\n }\n }\n\n public render(): TemplateResult {\n return html`\n ${this.mask\n ? html`<div class=\"mask ${this.open ? 'open' : ''}\" />`\n : null}\n\n <div\n class=\"wrapper ${getClasses({\n open: this.open\n })}\"\n >\n <slot\n name=\"toggle\"\n class=\"toggle\"\n @click=${this.handleToggleClicked}\n ></slot>\n <div\n class=\"${getClasses({\n dropdown: true,\n dormant: this.dormant\n })}\"\n style=${styleMap(this.dropdownStyle)}\n tabindex=\"0\"\n >\n <div class=\"arrow\" style=${styleMap(this.arrowStyle)}></div>\n <div class=\"dropdown-wrapper\">\n <slot name=\"dropdown\" tabindex=\"1\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Dropdown.js","sourceRoot":"","sources":["../../../src/dropdown/Dropdown.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAkB,MAAM,KAAK,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAE5D,MAAM,OAAO,QAAS,SAAQ,YAAY;IACxC,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiFT,CAAC;IACJ,CAAC;IAuBD;QACE,KAAK,EAAE,CAAC;QArBV,SAAI,GAAG,KAAK,CAAC;QAGb,YAAO,GAAG,IAAI,CAAC;QAGf,cAAS,GAAG,CAAC,CAAC;QAGd,WAAM,GAAG,EAAE,CAAC;QAGZ,SAAI,GAAG,KAAK,CAAC;QAGb,kBAAa,GAAG,EAAE,CAAC;QAGnB,eAAU,GAAG,EAAE,CAAC;QAId,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAKM,YAAY,CAAC,KAAU;QAC5B,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAC5C,WAAW,CACM,CAAC;QAEpB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9C,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9D,CAAC;IAEO,UAAU,CAAC,KAAiB;QAClC,MAAM,SAAS,GAAG,KAAK,CAAC,aAAoB,CAAC;QAE7C,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACrD,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAC5C,WAAW,CACM,CAAC;QACpB,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEjB,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAE/D,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAExB,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEM,OAAO,CAAC,iBAAmC;QAChD,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAEjC,IAAI,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAC1B,CAAC;QAED,IAAI,iBAAiB,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3C,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAEM,iBAAiB;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAC5C,WAAW,CACM,CAAC;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;QAExD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAmB,CAAC;QAExE,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,cAAc,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC;YACxD,MAAM,YAAY,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACpD,MAAM,WAAW,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;YAElD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YAED,MAAM,aAAa,GAAG;gBACpB,MAAM,EAAE,2BAA2B;gBACnC,SAAS,EAAE,OAAO;aACnB,CAAC;YAEF,qCAAqC;YACrC,IAAI,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC7C,aAAa,CAAC,MAAM,CAAC;oBACnB,YAAY,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK,GAAG,IAAI,CAAC;gBACnD,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC9B,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;YAED,mCAAmC;YACnC,IAAI,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC/C,aAAa,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC;gBACvE,aAAa,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC;gBACvC,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;YAED,MAAM,UAAU,GAAG;gBACjB,IAAI,EAAE,YAAY,CAAC,KAAK,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI;gBAC3D,WAAW,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI;gBAClC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI;aACjC,CAAC;YAEF,IAAI,QAAQ,EAAE,CAAC;gBACb,+BAA+B;gBAC/B,UAAU,CAAC,WAAW,CAAC,GAAG,gBAAgB,CAAC;gBAE3C,6CAA6C;gBAC7C,UAAU,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;gBAC3B,UAAU,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACrD,CAAC;YAED,IAAI,UAAU,EAAE,CAAC;gBACf,UAAU,CAAC,OAAO,CAAC;oBACjB,YAAY,CAAC,KAAK,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC;gBACxD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;YAED,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEM,mBAAmB,CAAC,KAAiB;QAC1C,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAEM,MAAM;QACX,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,IAAI;YACT,CAAC,CAAC,IAAI,CAAA,qBAAqB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM;YACxD,CAAC,CAAC,IAAI;;;yBAGW,UAAU,CAAC;YAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;;;;;mBAKS,IAAI,CAAC,mBAAmB;;;mBAGxB,UAAU,CAAC;YAClB,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC;kBACM,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;;;qCAGT,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;;;;;;KAMzD,CAAC;IACJ,CAAC;CACF;AA/MC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;sCACf;AAGb;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;yCACb;AAGf;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2CACb;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCACf;AAGZ;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;sCACf;AAGb;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;+CAC1B;AAGnB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;4CAC7B","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { RapidElement } from '../RapidElement';\nimport { getClasses } from '../utils';\nimport { CustomEventType } from '../interfaces';\n\nimport { styleMap } from 'lit-html/directives/style-map.js';\n\nexport class Dropdown extends RapidElement {\n static get styles() {\n return css`\n :host {\n }\n\n .wrapper {\n position: relative;\n }\n\n .toggle {\n cursor: pointer;\n }\n\n .dropdown-wrapper {\n position: relative;\n overflow: auto;\n }\n\n .dropdown:focus {\n }\n\n .dropdown.dormant {\n pointer-events: none;\n }\n\n .dropdown {\n position: fixed;\n z-index: 2;\n padding: 0;\n opacity: 0;\n border-radius: calc(var(--curvature) * 1.5);\n background: #fff;\n transition: all calc(0.8 * var(--transition-speed)) var(--bounce);\n user-select: none;\n margin-top: 0px;\n margin-left: 0px;\n box-shadow: var(--dropdown-shadow);\n }\n\n .dropdown:focus {\n outline: none;\n }\n\n .arrow {\n content: '';\n width: 0px;\n height: 0;\n top: -6px;\n z-index: 10;\n position: absolute;\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 6px solid white;\n }\n\n .open .dropdown {\n opacity: 1;\n pointer-events: auto;\n transform: translateY(0.5em) scale(1);\n }\n\n .mask {\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.7);\n opacity: 0.5;\n transition: opacity var(--transition-speed) ease-in-out;\n pointer-events: none;\n z-index: 1;\n }\n\n .mask.open {\n opacity: 1;\n pointer-events: auto;\n }\n\n .right {\n right: 0;\n }\n `;\n }\n\n @property({ type: Boolean })\n open = false;\n\n @property({ type: Boolean })\n dormant = true;\n\n @property({ type: Number })\n arrowSize = 8;\n\n @property({ type: Number })\n margin = 10;\n\n @property({ type: Boolean })\n mask = false;\n\n @property({ type: Object, attribute: false })\n dropdownStyle = {};\n\n @property({ type: Object, attribute: false })\n arrowStyle = {};\n\n constructor() {\n super();\n this.calculatePosition = this.calculatePosition.bind(this);\n }\n\n private activeFocus: any;\n private blurHandler: any;\n\n public firstUpdated(props: any) {\n super.firstUpdated(props);\n this.resetBlurHandler();\n }\n\n private resetBlurHandler() {\n const dropdown = this.shadowRoot.querySelector(\n '.dropdown'\n ) as HTMLDivElement;\n\n if (this.activeFocus) {\n this.activeFocus.removeEventListener('blur', this.blurHandler);\n }\n\n this.activeFocus = dropdown;\n this.blurHandler = this.handleBlur.bind(this);\n\n this.activeFocus.addEventListener('blur', this.blurHandler);\n }\n\n private handleBlur(event: FocusEvent) {\n const newTarget = event.relatedTarget as any;\n\n if (this.contains(newTarget)) {\n newTarget.addEventListener('blur', this.blurHandler);\n this.activeFocus = newTarget;\n } else {\n this.closeDropdown();\n }\n }\n\n private openDropdown() {\n this.open = true;\n this.dormant = false;\n this.resetBlurHandler();\n\n const dropdown = this.shadowRoot.querySelector(\n '.dropdown'\n ) as HTMLDivElement;\n dropdown.focus();\n dropdown.click();\n\n this.fireCustomEvent(CustomEventType.Opened);\n }\n\n private closeDropdown() {\n this.activeFocus.removeEventListener('blur', this.blurHandler);\n\n this.open = false;\n this.resetBlurHandler();\n\n window.setTimeout(() => {\n this.dormant = true;\n }, 250);\n\n this.blur();\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n if (changedProperties.has('open')) {\n this.dropdownStyle = {};\n }\n\n if (changedProperties.has('dropdownStyle')) {\n if (Object.keys(this.dropdownStyle).length === 0) {\n this.calculatePosition();\n }\n }\n }\n\n public calculatePosition() {\n const dropdown = this.shadowRoot.querySelector(\n '.dropdown'\n ) as HTMLDivElement;\n const toggle = this.querySelector('div[slot=\"toggle\"]');\n\n const arrow = this.shadowRoot.querySelector('.arrow') as HTMLDivElement;\n\n let bumpedUp = false;\n let bumpedLeft = false;\n\n if (dropdown && toggle) {\n const dropdownBounds = dropdown.getBoundingClientRect();\n const toggleBounds = toggle.getBoundingClientRect();\n const arrowBounds = arrow.getBoundingClientRect();\n\n if (!toggle) {\n return;\n }\n\n const dropdownStyle = {\n border: '1px solid rgba(0,0,0,0.1)',\n marginTop: '0.5em'\n };\n\n // if off the the right, bump it left\n if (dropdownBounds.right > window.innerWidth) {\n dropdownStyle['left'] =\n toggleBounds.right - dropdownBounds.width + 'px';\n delete dropdownStyle['right'];\n bumpedLeft = true;\n }\n\n // if off to the bottom, bump it up\n if (dropdownBounds.bottom > window.innerHeight) {\n dropdownStyle['top'] = toggleBounds.top - dropdownBounds.height + 'px';\n dropdownStyle['margin-top'] = '-0.5em';\n bumpedUp = true;\n }\n\n const arrowStyle = {\n left: toggleBounds.width / 2 - arrowBounds.width / 2 + 'px',\n borderWidth: this.arrowSize + 'px',\n top: '-' + this.arrowSize + 'px'\n };\n\n if (bumpedUp) {\n // rotate our arrow 180 degrees\n arrowStyle['transform'] = 'rotate(180deg)';\n\n // and place it at the bottom of the dropdown\n arrowStyle['top'] = 'auto';\n arrowStyle['bottom'] = '-' + this.arrowSize + 'px';\n }\n\n if (bumpedLeft) {\n arrowStyle['right'] =\n toggleBounds.width / 2 - arrowBounds.width / 2 + 'px';\n delete arrowStyle['left'];\n }\n\n this.arrowStyle = arrowStyle;\n this.dropdownStyle = dropdownStyle;\n }\n this.requestUpdate();\n }\n\n public handleToggleClicked(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n if (!this.open && this.dormant) {\n this.openDropdown();\n }\n }\n\n public render(): TemplateResult {\n return html`\n ${this.mask\n ? html`<div class=\"mask ${this.open ? 'open' : ''}\" />`\n : null}\n\n <div\n class=\"wrapper ${getClasses({\n open: this.open\n })}\"\n >\n <slot\n name=\"toggle\"\n class=\"toggle\"\n @click=${this.handleToggleClicked}\n ></slot>\n <div\n class=\"${getClasses({\n dropdown: true,\n dormant: this.dormant\n })}\"\n style=${styleMap(this.dropdownStyle)}\n tabindex=\"0\"\n >\n <div class=\"arrow\" style=${styleMap(this.arrowStyle)}></div>\n <div class=\"dropdown-wrapper\">\n <slot name=\"dropdown\" tabindex=\"1\"></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n"]}
|
|
@@ -115,8 +115,9 @@ export class TembaList extends RapidElement {
|
|
|
115
115
|
const index = this.getItemIndex(value);
|
|
116
116
|
this.items.splice(index, 1);
|
|
117
117
|
this.items = [...this.items];
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
if (this.cursorIndex === index) {
|
|
119
|
+
this.cursorIndex = -1;
|
|
120
|
+
}
|
|
120
121
|
// request a change even if it is the same, the item is different
|
|
121
122
|
this.requestUpdate('cursorIndex');
|
|
122
123
|
this.requestUpdate('items');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TembaList.js","sourceRoot":"","sources":["../../../src/list/TembaList.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { CustomEventType } from '../interfaces';\nimport { RapidElement } from '../RapidElement';\nimport { Store } from '../store/Store';\nimport { fetchResultsPage, ResultsPage } from '../utils';\n\nconst DEFAULT_REFRESH = 10000;\n\nexport class TembaList extends RapidElement {\n @property({ type: Array, attribute: false })\n items: any[] = [];\n\n @property({ type: Object, attribute: false })\n selected: any;\n\n @property({ type: Number })\n cursorIndex = -1;\n\n @property({ type: String })\n endpoint: string;\n\n @property({ type: String })\n nextSelection: any;\n\n @property({ type: Number })\n tabIndex = 1;\n\n @property({ type: String })\n valueKey = 'id';\n\n @property({ type: String })\n value: string;\n\n @property({ type: Boolean })\n loading = false;\n\n @property({ type: Boolean })\n collapsed: boolean;\n\n @property({ type: Boolean })\n hideShadow: boolean;\n\n @property({ type: Boolean })\n paused = false;\n\n @property({ type: Boolean })\n internalFocusDisabled = false;\n\n @property({ attribute: false })\n getNextRefresh: (firstOption: any) => any;\n\n @property({ attribute: false })\n sanitizeOption: (option: any) => any;\n\n @property({ attribute: false })\n renderOption: (option: any, selected: boolean) => TemplateResult;\n\n @property({ attribute: false })\n renderOptionDetail: (option: any, selected: boolean) => TemplateResult;\n\n @property({ attribute: false, type: Object })\n mostRecentItem: any;\n\n // changes to the refresh key force a refresh\n @property({ type: String })\n refreshKey = '0';\n\n reverseRefresh = true;\n\n // our next page from our endpoint\n nextPage: string = null;\n\n pages = 0;\n clearRefreshTimeout: any;\n pending: AbortController[] = [];\n\n store: Store;\n\n // used for testing only\n preserve: boolean;\n\n static get styles() {\n return css`\n temba-options {\n display: block;\n width: 100%;\n flex-grow: 1;\n }\n `;\n }\n\n constructor() {\n super();\n this.store = document.querySelector('temba-store') as Store;\n this.handleSelection.bind(this);\n }\n\n private reset(): void {\n this.selected = null;\n this.nextPage = null;\n this.cursorIndex = -1;\n this.mostRecentItem = null;\n this.items = [];\n }\n\n refreshInterval = null;\n\n public connectedCallback() {\n super.connectedCallback();\n this.refreshInterval = setInterval(() => {\n if (!this.paused) {\n this.refreshKey = 'default_' + new Date().getTime();\n }\n }, DEFAULT_REFRESH);\n }\n\n public disconnectedCallback() {\n clearInterval(this.refreshInterval);\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n if (changedProperties.has('endpoint') && this.endpoint) {\n this.reset();\n this.loading = true;\n this.fetchItems();\n }\n\n if (changedProperties.has('loading')) {\n if (!this.loading) {\n this.fireCustomEvent(CustomEventType.FetchComplete);\n }\n }\n\n if (\n changedProperties.has('refreshKey') &&\n !changedProperties.has('endpoint')\n ) {\n this.refreshTop();\n }\n\n if (changedProperties.has('mostRecentItem') && this.mostRecentItem) {\n this.fireCustomEvent(CustomEventType.Refreshed);\n }\n\n if (changedProperties.has('cursorIndex')) {\n if (this.cursorIndex > -1) {\n this.selected = this.items[this.cursorIndex];\n this.handleSelected(this.selected);\n }\n }\n\n if (changedProperties.has('items')) {\n //\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public handleSelected(selected: any) {\n const evt = new Event('change', { bubbles: true });\n this.dispatchEvent(evt);\n }\n\n private getValue(obj: any): any {\n if (!obj) {\n return null;\n }\n\n const path = this.valueKey.split('.');\n let current = obj;\n while (path.length > 0) {\n const key = path.shift();\n current = current[key];\n }\n return current;\n }\n\n public setSelection(value: string) {\n const index = this.items.findIndex((item) => {\n return this.getValue(item) === value;\n });\n this.cursorIndex = index;\n this.selected = this.items[index];\n const evt = new Event('change', { bubbles: true });\n this.dispatchEvent(evt);\n }\n\n public getItemIndex(value: string) {\n return this.items.findIndex((option) => this.getValue(option) === value);\n }\n\n public removeItem(value: string) {\n const index = this.getItemIndex(value);\n this.items.splice(index, 1);\n this.items = [...this.items];\n\n // if we were at the end, move us down\n this.cursorIndex = Math.max(\n 0,\n Math.min(this.items.length - 1, this.cursorIndex - 1)\n );\n\n // request a change even if it is the same, the item is different\n this.requestUpdate('cursorIndex');\n this.requestUpdate('items');\n }\n\n public getSelection(): any {\n return this.selected;\n }\n\n public refresh(): void {\n this.refreshKey = 'requested_' + new Date().getTime();\n }\n\n public setEndpoint(endpoint: string, nextSelection: any = null) {\n this.endpoint = endpoint;\n this.nextSelection = nextSelection;\n }\n\n public getRefreshEndpoint() {\n return this.endpoint;\n }\n\n protected sanitizeResults(results: any[]): Promise<any[]> {\n return Promise.resolve(results);\n }\n\n /**\n * Refreshes the first page, updating any found items in our list\n */\n private async refreshTop(): Promise<void> {\n const refreshEndpoint = this.getRefreshEndpoint();\n if (!refreshEndpoint) {\n return;\n }\n\n // cancel any outstanding requests\n while (this.pending.length > 0) {\n const pending = this.pending.pop();\n pending.abort();\n }\n\n const controller = new AbortController();\n this.pending.push(controller);\n\n const prevItem = this.items[this.cursorIndex];\n\n try {\n const page = await fetchResultsPage(\n this.getRefreshEndpoint(),\n controller\n );\n\n const sanitizedResults = await this.sanitizeResults(page.results);\n const items = [...this.items];\n\n // remove any dupes already in our list\n if (sanitizedResults) {\n sanitizedResults.forEach((newOption: any) => {\n if (this.sanitizeOption) {\n this.sanitizeOption(newOption);\n }\n const newValue = this.getValue(newOption);\n const removeIndex = items.findIndex(\n (option) => this.getValue(option) === newValue\n );\n\n if (removeIndex > -1) {\n items.splice(removeIndex, 1);\n }\n });\n\n // insert our new items at the front\n let results = sanitizedResults;\n if (this.reverseRefresh) {\n results = sanitizedResults.reverse();\n }\n const newItems = [...results, ...items];\n\n const topItem = newItems[0];\n if (\n !this.mostRecentItem ||\n JSON.stringify(this.mostRecentItem) !== JSON.stringify(topItem)\n ) {\n this.mostRecentItem = topItem;\n }\n\n if (prevItem) {\n const newItem = newItems[this.cursorIndex];\n const prevValue = this.getValue(prevItem);\n if (prevValue !== this.getValue(newItem)) {\n const newIndex = newItems.findIndex(\n (option) => this.getValue(option) === prevValue\n );\n this.cursorIndex = newIndex;\n\n // make sure our focused item is visible\n window.setTimeout(() => {\n const options = this.shadowRoot.querySelector('temba-options');\n if (options) {\n const option =\n options.shadowRoot.querySelector('.option.focused');\n if (option) {\n option.scrollIntoView({ block: 'end', inline: 'nearest' });\n }\n }\n }, 0);\n }\n }\n\n this.items = newItems;\n }\n } catch (error) {\n this.paused = true;\n }\n }\n\n private async fetchItems(): Promise<void> {\n // cancel any outstanding requests\n while (this.pending.length > 0) {\n const pending = this.pending.pop();\n pending.abort();\n }\n\n let endpoint = this.endpoint;\n let pagesToFetch = this.pages || 1;\n let pages = 0;\n let nextPage = null;\n\n let fetchedItems: any[] = [];\n\n while (pagesToFetch > 0 && endpoint) {\n const controller = new AbortController();\n this.pending.push(controller);\n\n try {\n const page = await fetchResultsPage(endpoint, controller);\n const sanitizedResults = await this.sanitizeResults(page.results);\n\n // sanitize our options if necessary\n if (this.sanitizeOption) {\n sanitizedResults.forEach(this.sanitizeOption);\n }\n\n if (sanitizedResults) {\n fetchedItems = fetchedItems.concat(sanitizedResults);\n }\n\n // save our next pages\n nextPage = page.next;\n endpoint = nextPage;\n pagesToFetch--;\n pages++;\n } catch (error) {\n // aborted\n this.reset();\n this.paused = true;\n this.loading = false;\n return;\n }\n this.nextPage = nextPage;\n }\n this.pages = pages;\n\n const topItem = fetchedItems[0];\n if (\n !this.mostRecentItem ||\n JSON.stringify(this.mostRecentItem) !== JSON.stringify(topItem)\n ) {\n this.mostRecentItem = topItem;\n }\n\n // see if our cursor needs to move to stay on the same item\n const newItem = fetchedItems[this.cursorIndex];\n\n if (\n !this.nextSelection &&\n this.selected &&\n newItem &&\n this.getValue(newItem) !== this.getValue(this.selected)\n ) {\n const index = fetchedItems.findIndex((item) => {\n return this.getValue(item) === this.getValue(this.selected);\n });\n\n // old selection is in the new fetch\n if (index > -1) {\n this.cursorIndex = index;\n }\n // old selection is missing from the new fetch\n else {\n // if our index didn't change, our item still did, fire change\n if (this.cursorIndex === 0) {\n this.requestUpdate('cursorIndex');\n }\n // otherwise select the first item\n else {\n this.cursorIndex = 0;\n }\n }\n }\n\n // save our results\n this.items = fetchedItems;\n this.loading = false;\n this.pending = [];\n\n if (this.nextSelection) {\n this.setSelection(this.nextSelection);\n this.nextSelection = false;\n } else {\n if (this.cursorIndex === -1 && !this.isMobile()) {\n this.cursorIndex = 0;\n }\n }\n\n if (this.value) {\n this.setSelection(this.value);\n this.value = null;\n } else if (this.isMobile() && !this.selected) {\n this.cursorIndex = -1;\n this.value = null;\n this.selected = null;\n const evt = new Event('change', { bubbles: true });\n this.dispatchEvent(evt);\n }\n\n return Promise.resolve();\n }\n\n private handleScrollThreshold() {\n if (this.nextPage && !this.loading) {\n this.loading = true;\n fetchResultsPage(this.nextPage).then((page: ResultsPage) => {\n this.sanitizeResults(page.results).then((sanitizedResults) => {\n if (this.sanitizeOption) {\n sanitizedResults.forEach(this.sanitizeOption);\n }\n\n this.items = [...this.items, ...sanitizedResults];\n this.nextPage = page.next;\n this.pages++;\n this.loading = false;\n });\n });\n }\n }\n\n public renderHeader(): TemplateResult {\n return null;\n }\n\n public renderFooter(): TemplateResult {\n return null;\n }\n\n public getListStyle() {\n return '';\n }\n\n protected handleSelection(event: CustomEvent) {\n let index = event.detail.index;\n const selected = event.detail.selected;\n\n if (index === -1) {\n index = 0;\n }\n\n this.selected = selected;\n this.cursorIndex = index;\n\n event.stopPropagation();\n event.preventDefault();\n }\n\n public render(): TemplateResult {\n return html`\n ${this.renderHeader()}\n <temba-options\n style=\"${this.getListStyle()}\"\n visible\n block\n cursorSelection\n ?hideShadow=${this.hideShadow}\n ?collapsed=${this.collapsed}\n ?loading=${this.loading}\n ?internalFocusDisabled=${this.internalFocusDisabled}\n .renderOption=${this.renderOption}\n .renderOptionDetail=${this.renderOptionDetail}\n @temba-scroll-threshold=${this.handleScrollThreshold}\n @temba-selection=${this.handleSelection.bind(this)}\n .options=${this.items}\n .cursorIndex=${this.cursorIndex}\n >\n <slot></slot>\n </temba-options>\n ${this.renderFooter()}\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"TembaList.js","sourceRoot":"","sources":["../../../src/list/TembaList.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { CustomEventType } from '../interfaces';\nimport { RapidElement } from '../RapidElement';\nimport { Store } from '../store/Store';\nimport { fetchResultsPage, ResultsPage } from '../utils';\n\nconst DEFAULT_REFRESH = 10000;\n\nexport class TembaList extends RapidElement {\n @property({ type: Array, attribute: false })\n items: any[] = [];\n\n @property({ type: Object, attribute: false })\n selected: any;\n\n @property({ type: Number })\n cursorIndex = -1;\n\n @property({ type: String })\n endpoint: string;\n\n @property({ type: String })\n nextSelection: any;\n\n @property({ type: Number })\n tabIndex = 1;\n\n @property({ type: String })\n valueKey = 'id';\n\n @property({ type: String })\n value: string;\n\n @property({ type: Boolean })\n loading = false;\n\n @property({ type: Boolean })\n collapsed: boolean;\n\n @property({ type: Boolean })\n hideShadow: boolean;\n\n @property({ type: Boolean })\n paused = false;\n\n @property({ type: Boolean })\n internalFocusDisabled = false;\n\n @property({ attribute: false })\n getNextRefresh: (firstOption: any) => any;\n\n @property({ attribute: false })\n sanitizeOption: (option: any) => any;\n\n @property({ attribute: false })\n renderOption: (option: any, selected: boolean) => TemplateResult;\n\n @property({ attribute: false })\n renderOptionDetail: (option: any, selected: boolean) => TemplateResult;\n\n @property({ attribute: false, type: Object })\n mostRecentItem: any;\n\n // changes to the refresh key force a refresh\n @property({ type: String })\n refreshKey = '0';\n\n reverseRefresh = true;\n\n // our next page from our endpoint\n nextPage: string = null;\n\n pages = 0;\n clearRefreshTimeout: any;\n pending: AbortController[] = [];\n\n store: Store;\n\n // used for testing only\n preserve: boolean;\n\n static get styles() {\n return css`\n temba-options {\n display: block;\n width: 100%;\n flex-grow: 1;\n }\n `;\n }\n\n constructor() {\n super();\n this.store = document.querySelector('temba-store') as Store;\n this.handleSelection.bind(this);\n }\n\n private reset(): void {\n this.selected = null;\n this.nextPage = null;\n this.cursorIndex = -1;\n this.mostRecentItem = null;\n this.items = [];\n }\n\n refreshInterval = null;\n\n public connectedCallback() {\n super.connectedCallback();\n this.refreshInterval = setInterval(() => {\n if (!this.paused) {\n this.refreshKey = 'default_' + new Date().getTime();\n }\n }, DEFAULT_REFRESH);\n }\n\n public disconnectedCallback() {\n clearInterval(this.refreshInterval);\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n if (changedProperties.has('endpoint') && this.endpoint) {\n this.reset();\n this.loading = true;\n this.fetchItems();\n }\n\n if (changedProperties.has('loading')) {\n if (!this.loading) {\n this.fireCustomEvent(CustomEventType.FetchComplete);\n }\n }\n\n if (\n changedProperties.has('refreshKey') &&\n !changedProperties.has('endpoint')\n ) {\n this.refreshTop();\n }\n\n if (changedProperties.has('mostRecentItem') && this.mostRecentItem) {\n this.fireCustomEvent(CustomEventType.Refreshed);\n }\n\n if (changedProperties.has('cursorIndex')) {\n if (this.cursorIndex > -1) {\n this.selected = this.items[this.cursorIndex];\n this.handleSelected(this.selected);\n }\n }\n\n if (changedProperties.has('items')) {\n //\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public handleSelected(selected: any) {\n const evt = new Event('change', { bubbles: true });\n this.dispatchEvent(evt);\n }\n\n private getValue(obj: any): any {\n if (!obj) {\n return null;\n }\n\n const path = this.valueKey.split('.');\n let current = obj;\n while (path.length > 0) {\n const key = path.shift();\n current = current[key];\n }\n return current;\n }\n\n public setSelection(value: string) {\n const index = this.items.findIndex((item) => {\n return this.getValue(item) === value;\n });\n this.cursorIndex = index;\n this.selected = this.items[index];\n const evt = new Event('change', { bubbles: true });\n this.dispatchEvent(evt);\n }\n\n public getItemIndex(value: string) {\n return this.items.findIndex((option) => this.getValue(option) === value);\n }\n\n public removeItem(value: string) {\n const index = this.getItemIndex(value);\n this.items.splice(index, 1);\n this.items = [...this.items];\n if (this.cursorIndex === index) {\n this.cursorIndex = -1;\n }\n\n // request a change even if it is the same, the item is different\n this.requestUpdate('cursorIndex');\n this.requestUpdate('items');\n }\n\n public getSelection(): any {\n return this.selected;\n }\n\n public refresh(): void {\n this.refreshKey = 'requested_' + new Date().getTime();\n }\n\n public setEndpoint(endpoint: string, nextSelection: any = null) {\n this.endpoint = endpoint;\n this.nextSelection = nextSelection;\n }\n\n public getRefreshEndpoint() {\n return this.endpoint;\n }\n\n protected sanitizeResults(results: any[]): Promise<any[]> {\n return Promise.resolve(results);\n }\n\n /**\n * Refreshes the first page, updating any found items in our list\n */\n private async refreshTop(): Promise<void> {\n const refreshEndpoint = this.getRefreshEndpoint();\n if (!refreshEndpoint) {\n return;\n }\n\n // cancel any outstanding requests\n while (this.pending.length > 0) {\n const pending = this.pending.pop();\n pending.abort();\n }\n\n const controller = new AbortController();\n this.pending.push(controller);\n\n const prevItem = this.items[this.cursorIndex];\n\n try {\n const page = await fetchResultsPage(\n this.getRefreshEndpoint(),\n controller\n );\n\n const sanitizedResults = await this.sanitizeResults(page.results);\n const items = [...this.items];\n\n // remove any dupes already in our list\n if (sanitizedResults) {\n sanitizedResults.forEach((newOption: any) => {\n if (this.sanitizeOption) {\n this.sanitizeOption(newOption);\n }\n const newValue = this.getValue(newOption);\n const removeIndex = items.findIndex(\n (option) => this.getValue(option) === newValue\n );\n\n if (removeIndex > -1) {\n items.splice(removeIndex, 1);\n }\n });\n\n // insert our new items at the front\n let results = sanitizedResults;\n if (this.reverseRefresh) {\n results = sanitizedResults.reverse();\n }\n const newItems = [...results, ...items];\n\n const topItem = newItems[0];\n if (\n !this.mostRecentItem ||\n JSON.stringify(this.mostRecentItem) !== JSON.stringify(topItem)\n ) {\n this.mostRecentItem = topItem;\n }\n\n if (prevItem) {\n const newItem = newItems[this.cursorIndex];\n const prevValue = this.getValue(prevItem);\n if (prevValue !== this.getValue(newItem)) {\n const newIndex = newItems.findIndex(\n (option) => this.getValue(option) === prevValue\n );\n this.cursorIndex = newIndex;\n\n // make sure our focused item is visible\n window.setTimeout(() => {\n const options = this.shadowRoot.querySelector('temba-options');\n if (options) {\n const option =\n options.shadowRoot.querySelector('.option.focused');\n if (option) {\n option.scrollIntoView({ block: 'end', inline: 'nearest' });\n }\n }\n }, 0);\n }\n }\n\n this.items = newItems;\n }\n } catch (error) {\n this.paused = true;\n }\n }\n\n private async fetchItems(): Promise<void> {\n // cancel any outstanding requests\n while (this.pending.length > 0) {\n const pending = this.pending.pop();\n pending.abort();\n }\n\n let endpoint = this.endpoint;\n let pagesToFetch = this.pages || 1;\n let pages = 0;\n let nextPage = null;\n\n let fetchedItems: any[] = [];\n\n while (pagesToFetch > 0 && endpoint) {\n const controller = new AbortController();\n this.pending.push(controller);\n\n try {\n const page = await fetchResultsPage(endpoint, controller);\n const sanitizedResults = await this.sanitizeResults(page.results);\n\n // sanitize our options if necessary\n if (this.sanitizeOption) {\n sanitizedResults.forEach(this.sanitizeOption);\n }\n\n if (sanitizedResults) {\n fetchedItems = fetchedItems.concat(sanitizedResults);\n }\n\n // save our next pages\n nextPage = page.next;\n endpoint = nextPage;\n pagesToFetch--;\n pages++;\n } catch (error) {\n // aborted\n this.reset();\n this.paused = true;\n this.loading = false;\n return;\n }\n this.nextPage = nextPage;\n }\n this.pages = pages;\n\n const topItem = fetchedItems[0];\n if (\n !this.mostRecentItem ||\n JSON.stringify(this.mostRecentItem) !== JSON.stringify(topItem)\n ) {\n this.mostRecentItem = topItem;\n }\n\n // see if our cursor needs to move to stay on the same item\n const newItem = fetchedItems[this.cursorIndex];\n\n if (\n !this.nextSelection &&\n this.selected &&\n newItem &&\n this.getValue(newItem) !== this.getValue(this.selected)\n ) {\n const index = fetchedItems.findIndex((item) => {\n return this.getValue(item) === this.getValue(this.selected);\n });\n\n // old selection is in the new fetch\n if (index > -1) {\n this.cursorIndex = index;\n }\n // old selection is missing from the new fetch\n else {\n // if our index didn't change, our item still did, fire change\n if (this.cursorIndex === 0) {\n this.requestUpdate('cursorIndex');\n }\n // otherwise select the first item\n else {\n this.cursorIndex = 0;\n }\n }\n }\n\n // save our results\n this.items = fetchedItems;\n this.loading = false;\n this.pending = [];\n\n if (this.nextSelection) {\n this.setSelection(this.nextSelection);\n this.nextSelection = false;\n } else {\n if (this.cursorIndex === -1 && !this.isMobile()) {\n this.cursorIndex = 0;\n }\n }\n\n if (this.value) {\n this.setSelection(this.value);\n this.value = null;\n } else if (this.isMobile() && !this.selected) {\n this.cursorIndex = -1;\n this.value = null;\n this.selected = null;\n const evt = new Event('change', { bubbles: true });\n this.dispatchEvent(evt);\n }\n\n return Promise.resolve();\n }\n\n private handleScrollThreshold() {\n if (this.nextPage && !this.loading) {\n this.loading = true;\n fetchResultsPage(this.nextPage).then((page: ResultsPage) => {\n this.sanitizeResults(page.results).then((sanitizedResults) => {\n if (this.sanitizeOption) {\n sanitizedResults.forEach(this.sanitizeOption);\n }\n\n this.items = [...this.items, ...sanitizedResults];\n this.nextPage = page.next;\n this.pages++;\n this.loading = false;\n });\n });\n }\n }\n\n public renderHeader(): TemplateResult {\n return null;\n }\n\n public renderFooter(): TemplateResult {\n return null;\n }\n\n public getListStyle() {\n return '';\n }\n\n protected handleSelection(event: CustomEvent) {\n let index = event.detail.index;\n const selected = event.detail.selected;\n\n if (index === -1) {\n index = 0;\n }\n\n this.selected = selected;\n this.cursorIndex = index;\n\n event.stopPropagation();\n event.preventDefault();\n }\n\n public render(): TemplateResult {\n return html`\n ${this.renderHeader()}\n <temba-options\n style=\"${this.getListStyle()}\"\n visible\n block\n cursorSelection\n ?hideShadow=${this.hideShadow}\n ?collapsed=${this.collapsed}\n ?loading=${this.loading}\n ?internalFocusDisabled=${this.internalFocusDisabled}\n .renderOption=${this.renderOption}\n .renderOptionDetail=${this.renderOptionDetail}\n @temba-scroll-threshold=${this.handleScrollThreshold}\n @temba-selection=${this.handleSelection.bind(this)}\n .options=${this.items}\n .cursorIndex=${this.cursorIndex}\n >\n <slot></slot>\n </temba-options>\n ${this.renderFooter()}\n `;\n }\n}\n"]}
|
|
@@ -548,11 +548,6 @@ export class TembaMenu extends ResizeElement {
|
|
|
548
548
|
margin-right: 0.75em;
|
|
549
549
|
}
|
|
550
550
|
|
|
551
|
-
temba-button[lined] {
|
|
552
|
-
margin: 0.2em 0;
|
|
553
|
-
display: block;
|
|
554
|
-
}
|
|
555
|
-
|
|
556
551
|
.expand-icon {
|
|
557
552
|
transform: rotate(180deg);
|
|
558
553
|
--icon-color: rgba(255, 255, 255, 0.5);
|
|
@@ -614,6 +609,14 @@ export class TembaMenu extends ResizeElement {
|
|
|
614
609
|
.level-0 .icon-wrapper {
|
|
615
610
|
padding: 0.4em 0.9em;
|
|
616
611
|
}
|
|
612
|
+
|
|
613
|
+
temba-workspace-select {
|
|
614
|
+
margin: 0.2em;
|
|
615
|
+
display: block;
|
|
616
|
+
--options-shadow: none;
|
|
617
|
+
--color-widget-border: transparent;
|
|
618
|
+
--widget-box-shadow: none;
|
|
619
|
+
}
|
|
617
620
|
`;
|
|
618
621
|
}
|
|
619
622
|
constructor() {
|
|
@@ -626,6 +629,15 @@ export class TembaMenu extends ResizeElement {
|
|
|
626
629
|
if (menuItem.type === 'divider') {
|
|
627
630
|
return html `<div class="divider"></div>`;
|
|
628
631
|
}
|
|
632
|
+
if (menuItem.type === 'temba-workspace-select') {
|
|
633
|
+
return html `<temba-workspace-select
|
|
634
|
+
@change=${(event) => {
|
|
635
|
+
event.stopPropagation();
|
|
636
|
+
event.preventDefault();
|
|
637
|
+
}}
|
|
638
|
+
.values=${[JSON.parse(menuItem.initial)]}
|
|
639
|
+
></temba-workspace-select>`;
|
|
640
|
+
}
|
|
629
641
|
if (menuItem.type === 'temba-notification-list') {
|
|
630
642
|
return html `<temba-notification-list
|
|
631
643
|
endpoint=${menuItem.href}
|