@dialpad/dialtone
Version:
Dialpad's Dialtone design system monorepo
1 lines • 46.7 kB
Source Map (JSON)
{"version":3,"file":"message-input.cjs","sources":["../../../recipes/conversation_view/message_input/extensions/meeting_pill/MeetingPill.vue","../../../recipes/conversation_view/message_input/extensions/meeting_pill/meeting_pill.js","../../../recipes/conversation_view/message_input/message_input.vue"],"sourcesContent":["<template>\n <node-view-wrapper class=\"d-recipe-message-input-meeting-pill\">\n <dt-item-layout\n class=\"d-recipe-message-input-meeting-pill__layout\"\n unstyled\n >\n <template #left>\n <div class=\"d-recipe-message-input-meeting-pill__icon\">\n <dt-icon-video\n size=\"400\"\n />\n </div>\n </template>\n {{ node.attrs.text }}\n <template #right>\n <div class=\"d-recipe-message-input-meeting-pill__close\">\n <dt-button\n circle\n :aria-label=\"node.attrs['close-button-aria-label']\"\n size=\"xs\"\n importance=\"clear\"\n @click=\"close\"\n >\n <template #icon>\n <dt-icon-close\n size=\"300\"\n />\n </template>\n </dt-button>\n </div>\n </template>\n </dt-item-layout>\n </node-view-wrapper>\n</template>\n\n<script>\nimport { NodeViewWrapper, nodeViewProps } from '@tiptap/vue-3';\nimport { DtItemLayout } from '@/components/item_layout';\nimport { DtIconClose, DtIconVideo } from '@dialpad/dialtone-icons/vue3';\nimport { DtButton } from '@/components/button';\n\nexport default {\n name: 'MeetingPill',\n\n components: {\n NodeViewWrapper,\n DtItemLayout,\n DtIconClose,\n DtButton,\n DtIconVideo,\n },\n\n props: nodeViewProps,\n\n emits: ['meeting-pill-close'],\n\n methods: {\n close (e) {\n this.$parent.$emit('meeting-pill-close', e);\n },\n },\n};\n</script>\n","import { mergeAttributes, Node } from '@tiptap/core';\nimport { VueNodeViewRenderer } from '@tiptap/vue-3';\nimport MeetingPill from './MeetingPill.vue';\n\nexport default Node.create({\n\n atom: true,\n group: 'inline',\n inline: true,\n\n addNodeView () {\n return VueNodeViewRenderer(MeetingPill);\n },\n\n addAttributes () {\n return {\n text: {\n default: 'Please pass in \"text\" attribute',\n },\n 'close-button-aria-label': {},\n };\n },\n\n parseHTML () {\n return [\n {\n tag: 'meeting-pill',\n },\n ];\n },\n\n renderText ({ node }) {\n return '/dpm';\n },\n\n renderHTML ({ HTMLAttributes }) {\n return ['meeting-pill', mergeAttributes(HTMLAttributes)];\n },\n});\n","<!-- eslint-disable max-lines -->\n<template>\n <div\n data-qa=\"dt-recipe-message-input\"\n role=\"presentation\"\n class=\"d-recipe-message-input\"\n v-bind=\"addClassStyleAttrs($attrs)\"\n @dragover.prevent\n @drop.prevent=\"onDrop\"\n @paste=\"onPaste\"\n @mousedown=\"onMousedown\"\n >\n <!-- @slot Renders above the input, but still within the borders. -->\n <slot name=\"top\" />\n\n <!-- set key to selectedText to force update. otherwise this component may not reflect the active selection -->\n <dt-recipe-message-input-topbar\n v-if=\"richText\"\n :key=\"selectedText\"\n :bold-button-options=\"boldButtonOptions\"\n :italic-button-options=\"italicButtonOptions\"\n :strike-button-options=\"strikeButtonOptions\"\n :bullet-list-button-options=\"bulletListButtonOptions\"\n :ordered-list-button-options=\"orderedListButtonOptions\"\n :block-quote-button-options=\"blockQuoteButtonOptions\"\n :code-button-options=\"codeButtonOptions\"\n :code-block-button-options=\"codeBlockButtonOptions\"\n :is-selection-active=\"isSelectionActive\"\n @click=\"handleTopbarClick\"\n >\n <template #link>\n <dt-recipe-message-input-link\n ref=\"link\"\n :open=\"linkDialogOpen\"\n :link-button-options=\"linkButtonOptions\"\n :is-selection-active=\"isSelectionActive\"\n @opened=\"linkDialogOpened\"\n @set-link=\"setLink\"\n @remove-link=\"removeLink\"\n />\n </template>\n </dt-recipe-message-input-topbar>\n <!-- Some wrapper to restrict the height and show the scrollbar -->\n <div\n v-dt-scrollbar\n class=\"d-recipe-message-input__editor-wrapper\"\n :style=\"{ 'max-height': maxHeight }\"\n >\n <dt-rich-text-editor\n ref=\"richTextEditor\"\n v-model=\"internalInputValue\"\n :allow-blockquote=\"richText\"\n :allow-bold=\"richText\"\n :allow-bullet-list=\"richText\"\n :allow-code=\"richText\"\n :allow-codeblock=\"richText\"\n :allow-italic=\"richText\"\n :allow-strike=\"richText\"\n :allow-underline=\"richText\"\n :paste-rich-text=\"richText\"\n :editable=\"editable\"\n :input-aria-label=\"inputAriaLabel\"\n :input-class=\"inputClass\"\n :output-format=\"outputFormat\"\n :auto-focus=\"autoFocus\"\n :link=\"richText\"\n :placeholder=\"placeholder\"\n :prevent-typing=\"preventTyping\"\n :mention-suggestion=\"mentionSuggestion\"\n :channel-suggestion=\"channelSuggestion\"\n :slash-command-suggestion=\"slashCommandSuggestion\"\n :additional-extensions=\"additionalExtensions\"\n :hide-link-bubble-menu=\"hideLinkBubbleMenu\"\n v-bind=\"removeClassStyleAttrs($attrs)\"\n @input=\"onInput\"\n @text-input=\"onTextInput\"\n @enter=\"onSend\"\n @selected=\"selectedText = $event\"\n @edit-link=\"initLinkDialog\"\n @focus=\"isFocused = true\"\n @blur=\"isFocused = false\"\n />\n </div>\n <!-- @slot Slot for attachment carousel -->\n <slot name=\"middle\" />\n <!-- Section for the bottom UI -->\n <section class=\"d-recipe-message-input__bottom-section\">\n <!-- Left content -->\n <div class=\"d-recipe-message-input__bottom-section-left\">\n <dt-stack\n gap=\"200\"\n direction=\"row\"\n >\n <dt-button\n v-if=\"showImagePicker\"\n v-dt-tooltip:top-start=\"showImagePicker?.tooltipLabel\"\n data-qa=\"dt-recipe-message-input-image-btn\"\n size=\"sm\"\n class=\"d-recipe-message-input__button\"\n kind=\"muted\"\n importance=\"clear\"\n :aria-label=\"showImagePicker.ariaLabel\"\n @click=\"onSelectImage\"\n @mouseenter=\"imagePickerFocus = true\"\n @mouseleave=\"imagePickerFocus = false\"\n @focus=\"imagePickerFocus = true\"\n @blur=\"imagePickerFocus = false\"\n >\n <template #icon>\n <dt-icon-image size=\"300\" />\n </template>\n </dt-button>\n <dt-input\n ref=\"messageInputImageUpload\"\n data-qa=\"dt-recipe-message-input-image-input\"\n accept=\"image/*, video/*\"\n type=\"file\"\n class=\"d-recipe-message-input__image-input\"\n multiple\n hidden\n @input=\"onImageUpload\"\n />\n <dt-popover\n v-if=\"showEmojiPicker\"\n open.sync=\"emojiPickerOpened\"\n data-qa=\"dt-recipe-message-input-emoji-picker-popover\"\n initial-focus-element=\"#searchInput\"\n padding=\"none\"\n >\n <template #anchor=\"{ attrs }\">\n <dt-button\n v-dt-tooltip=\"emojiTooltipMessage\"\n v-bind=\"attrs\"\n data-qa=\"dt-recipe-message-input-emoji-picker-btn\"\n size=\"sm\"\n class=\"d-recipe-message-input__button\"\n kind=\"muted\"\n importance=\"clear\"\n :aria-label=\"emojiButtonAriaLabel\"\n @click=\"toggleEmojiPicker\"\n @mouseenter=\"emojiPickerFocus = true\"\n @mouseleave=\"emojiPickerFocus = false\"\n @focus=\"emojiPickerFocus = true\"\n @blur=\"emojiPickerFocus = false\"\n >\n <template #icon>\n <dt-icon-very-satisfied\n v-if=\"emojiPickerHovered\"\n size=\"300\"\n />\n <dt-icon-satisfied\n v-else\n size=\"300\"\n />\n </template>\n </dt-button>\n </template>\n <template #content=\"{ close }\">\n <dt-emoji-picker\n v-bind=\"emojiPickerProps\"\n @skin-tone=\"onSkinTone\"\n @selected-emoji=\"(emoji) => onSelectEmoji(emoji, close)\"\n />\n </template>\n </dt-popover>\n <!-- @slot Slot for emojiGiphy picker -->\n <slot name=\"emojiGiphyPicker\" />\n <!-- @slot Slot to add extra action icons next to default ones -->\n <slot name=\"customActionIcons\" />\n </dt-stack>\n </div>\n <!-- Right content -->\n <div class=\"d-recipe-message-input__bottom-section-right\">\n <dt-stack\n direction=\"row\"\n gap=\"300\"\n >\n <!-- @slot Slot for sms count -->\n <div class=\"d-recipe-message-input__sms-count\">\n <slot name=\"smsCount\" />\n </div>\n\n <!-- Optionally displayed remaining character counter -->\n <dt-tooltip\n v-if=\"Boolean(showCharacterLimit)\"\n class=\"d-recipe-message-input__remaining-char-tooltip\"\n placement=\"top-end\"\n :enabled=\"characterLimitTooltipEnabled\"\n :message=\"showCharacterLimit.message\"\n :offset=\"[10, 8]\"\n >\n <template #anchor>\n <p\n v-show=\"displayCharacterLimitWarning\"\n class=\"d-recipe-message-input__remaining-char\"\n data-qa=\"dt-recipe-message-input-character-limit\"\n >\n {{ showCharacterLimit.count - inputLength }}\n </p>\n </template>\n </dt-tooltip>\n\n <!-- Cancel button for edit mode -->\n <dt-button\n v-if=\"showCancel\"\n data-qa=\"dt-recipe-message-input-cancel-button\"\n class=\"d-recipe-message-input__button d-recipe-message-input__cancel-button\"\n size=\"sm\"\n kind=\"muted\"\n importance=\"clear\"\n :aria-label=\"showCancel.ariaLabel\"\n @click=\"onCancel\"\n >\n <p>{{ showCancel.text }}</p>\n </dt-button>\n\n <!-- @slot Slot for sendButton picker -->\n <slot name=\"sendButton\">\n <!-- Send button -->\n <!-- Right positioned UI - send button -->\n <dt-button\n v-if=\"showSend\"\n v-dt-tooltip:top-end=\"showSend?.tooltipLabel\"\n data-qa=\"dt-recipe-message-input-send-btn\"\n size=\"sm\"\n kind=\"default\"\n importance=\"primary\"\n :class=\"[\n 'd-recipe-message-input__button d-recipe-message-input__send-button',\n {\n 'd-recipe-message-input__send-button--disabled': isSendDisabled,\n 'd-btn--icon-only': showSendIcon,\n },\n ]\"\n :aria-label=\"showSend.ariaLabel\"\n :aria-disabled=\"isSendDisabled\"\n @click=\"onSend\"\n >\n <template\n v-if=\"showSendIcon\"\n #icon\n >\n <!-- @slot Slot for send button icon -->\n <slot\n name=\"sendIcon\"\n :icon-size=\"sendIconSize\"\n >\n <dt-icon-send :size=\"sendIconSize\" />\n </slot>\n </template>\n <template v-if=\"showSend.text\">\n <p>{{ showSend.text }}</p>\n </template>\n </dt-button>\n </slot>\n </dt-stack>\n </div>\n </section>\n </div>\n</template>\n\n<script>\n/* eslint-disable max-lines */\nimport {\n DtRichTextEditor,\n RICH_TEXT_EDITOR_OUTPUT_FORMATS,\n RICH_TEXT_EDITOR_AUTOFOCUS_TYPES,\n} from '@/components/rich_text_editor';\nimport lastActiveNodes from './last_active_nodes';\nimport { removeClassStyleAttrs, returnFirstEl, addClassStyleAttrs } from '@/common/utils';\nimport MeetingPill from './extensions/meeting_pill/meeting_pill';\nimport { DtButton } from '@/components/button';\nimport { DtEmojiPicker } from '@/components/emoji_picker';\nimport { DtPopover } from '@/components/popover';\nimport { DtInput } from '@/components/input';\nimport { DtTooltip } from '@/components/tooltip';\nimport { DtStack } from '@/components/stack';\nimport {\n DtIconImage, DtIconVerySatisfied, DtIconSatisfied, DtIconSend,\n} from '@dialpad/dialtone-icons/vue3';\nimport DtRecipeMessageInputTopbar from './message_input_topbar.vue';\nimport DtRecipeMessageInputLink from './message_input_link.vue';\n\nimport {\n EDITOR_SUPPORTED_LINK_PROTOCOLS,\n EDITOR_DEFAULT_LINK_PREFIX,\n} from '../editor/editor_constants.js';\n\nexport default {\n compatConfig: { MODE: 3 },\n name: 'DtRecipeMessageInput',\n\n components: {\n DtButton,\n DtEmojiPicker,\n DtInput,\n DtPopover,\n DtRecipeMessageInputTopbar,\n DtRecipeMessageInputLink,\n DtRichTextEditor,\n DtTooltip,\n DtStack,\n DtIconImage,\n DtIconVerySatisfied,\n DtIconSatisfied,\n DtIconSend,\n },\n\n mixins: [],\n\n inheritAttrs: false,\n\n props: {\n /**\n * Displays all the buttons for rich text formatting above the message input, and enables it within the editor.\n * Rich text formatting for the purposes of this component is defined as:\n *\n * bold, italic, strikethrough, lists, blockquotes, inline code tags, and code blocks.\n *\n * If you are sending a message to a phone rather than a Dialpad to Dialpad message, you should have this as false.\n */\n richText: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Value of the input. The object format should match TipTap's JSON\n * document structure: https://tiptap.dev/guide/output#option-1-json\n */\n modelValue: {\n type: [Object, String],\n default: '',\n },\n\n /**\n * Whether the input is editable\n */\n editable: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Descriptive label for the input element\n */\n inputAriaLabel: {\n type: String,\n required: true,\n default: '',\n },\n\n /**\n * Prevents the user from typing any further. Deleting text will still work.\n */\n preventTyping: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Additional class name for the input element. Only accepts a String value\n * because this is passed to the editor via options. For multiple classes,\n * join them into one string, e.g. \"d-p8 d-hmx96\"\n */\n inputClass: {\n type: String,\n default: '',\n },\n\n /**\n * Whether the input should receive focus after the component has been\n * mounted. Either one of `start`, `end`, `all` or a Boolean or a Number.\n * - `start` Sets the focus to the beginning of the input\n * - `end` Sets the focus to the end of the input\n * - `all` Selects the whole contents of the input\n * - `Number` Sets the focus to a specific position in the input\n * - `true` Defaults to `start`\n * - `false` Disables autofocus\n * @values true, false, start, end, all, number\n */\n autoFocus: {\n type: [Boolean, String, Number],\n default: false,\n validator (autoFocus) {\n if (typeof autoFocus === 'string') {\n return RICH_TEXT_EDITOR_AUTOFOCUS_TYPES.includes(autoFocus);\n }\n return true;\n },\n },\n\n /**\n * The output format that the editor uses when emitting the \"@input\" event.\n * One of `text`, `json`, `html`. See https://tiptap.dev/guide/output for\n * examples.\n * @values text, json, html\n */\n outputFormat: {\n type: String,\n default: 'json',\n validator (outputFormat) {\n return RICH_TEXT_EDITOR_OUTPUT_FORMATS.includes(outputFormat);\n },\n },\n\n /**\n * Placeholder text\n */\n placeholder: {\n type: String,\n default: '',\n },\n\n /**\n * Disable Send Button\n */\n disableSend: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Content area needs to dynamically adjust height based on the conversation area height.\n * can be vh|px|rem|em|%\n */\n maxHeight: {\n type: String,\n default: 'unset',\n },\n\n // Emoji picker props\n showEmojiPicker: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Props to pass into the emoji picker.\n */\n emojiPickerProps: {\n type: Object,\n default: () => ({}),\n validate (emojiPickerProps) {\n return [\n 'searchNoResultsLabel',\n 'searchResultsLabel',\n 'searchPlaceholderLabel',\n 'skinSelectorButtonTooltipLabel',\n 'tabSetLabels',\n ].every((prop) => emojiPickerProps[prop] != null);\n },\n },\n\n /**\n * Emoji button tooltip label\n */\n emojiTooltipMessage: {\n type: String,\n default: 'Emoji',\n },\n\n // Aria label for buttons\n /**\n * Emoji button aria label\n */\n emojiButtonAriaLabel: {\n type: String,\n default: 'emoji button',\n },\n\n /**\n * Enable character Limit warning\n */\n showCharacterLimit: {\n type: [Boolean, Object],\n default: () => ({ count: 1500, warning: 500, message: '' }),\n },\n\n showImagePicker: {\n type: [Boolean, Object],\n default: () => ({\n tooltipLabel: 'Attach Image',\n ariaLabel: 'image button',\n }),\n },\n\n /**\n * Send button defaults.\n */\n showSend: {\n type: [Boolean, Object],\n default: () => ({}),\n },\n\n /**\n * Cancel button defaults.\n */\n showCancel: {\n type: [Boolean, Object],\n default: () => ({ text: 'Cancel' }),\n },\n\n /**\n * suggestion object containing the items query function.\n * The valid keys passed into this object can be found here: https://tiptap.dev/api/utilities/suggestion\n *\n * The only required key is the items function which is used to query the contacts for suggestion.\n * items({ query }) => { return [ContactObject]; }\n * ContactObject format:\n * { name: string, avatarSrc: string, id: string }\n *\n * When null, it does not add the plugin.\n */\n mentionSuggestion: {\n type: Object,\n default: null,\n },\n\n /**\n * suggestion object containing the items query function.\n * The valid keys passed into this object can be found here: https://tiptap.dev/api/utilities/suggestion\n *\n * The only required key is the items function which is used to query the channels for suggestion.\n * items({ query }) => { return [ChannelObject]; }\n * ChannelObject format:\n * { name: string, id: string, locked: boolean }\n *\n * When null, it does not add the plugin. Setting locked to true will display a lock rather than hash.\n */\n channelSuggestion: {\n type: Object,\n default: null,\n },\n\n /**\n * suggestion object containing the items query function.\n * The valid keys passed into this object can be found here: https://tiptap.dev/api/utilities/suggestion\n *\n * The only required key is the items function which is used to query the slash commands for suggestion.\n * items({ query }) => { return [SlashCommandObject]; }\n * SlashCommandObject format:\n * { command: string, description: string, parametersExample?: string }\n * The \"parametersExample\" parameter is optional, and describes an example\n * of the parameters that command can take.\n *\n * When null, it does not add the plugin.\n */\n slashCommandSuggestion: {\n type: Object,\n default: null,\n },\n\n /**\n * descriptive text fields for the bold button\n *\n * object format:\n * { ariaLabel: string, tooltipText: string, keyboardShortcutText: string }\n */\n boldButtonOptions: {\n type: Object,\n default: () => ({\n ariaLabel: 'Toggle bold on selected text',\n tooltipText: 'Bold',\n keyboardShortcutText: 'Mod + B',\n }),\n },\n\n /**\n * descriptive text fields for the italic button\n *\n * object format:\n * { ariaLabel: string, tooltipText: string, keyboardShortcutText: string }\n */\n italicButtonOptions: {\n type: Object,\n default: () => ({\n ariaLabel: 'Toggle italic on selected text',\n tooltipText: 'Italic',\n keyboardShortcutText: 'Mod + I',\n }),\n },\n\n /**\n * descriptive text fields for the strikethrough button\n *\n * object format:\n * { ariaLabel: string, tooltipText: string, keyboardShortcutText: string }\n */\n strikeButtonOptions: {\n type: Object,\n default: () => ({\n ariaLabel: 'Toggle strikethrough on selected text',\n tooltipText: 'Strikethrough',\n keyboardShortcutText: 'Mod + Shift + S',\n }),\n },\n\n /**\n * descriptive text fields for the link button\n *\n * object format:\n * { ariaLabel: string, tooltipText: string, keyboardShortcutText: string }\n */\n linkButtonOptions: {\n type: Object,\n default: () => ({\n ariaLabel: 'Create or edit link on selected text',\n tooltipText: 'Link',\n // TODO: implement mod k\n keyboardShortcutText: 'Mod + K',\n dialogTitle: 'Add a link',\n textLabel: 'Text to display (optional)',\n linkLabel: 'Link',\n linkPlaceholder: 'e.g. https://www.dialpad.com',\n removeLabel: 'Remove',\n cancelLabel: 'Cancel',\n confirmLabel: 'Done',\n visuallyHiddenCloseText: 'Close link dialog',\n }),\n },\n\n /**\n * descriptive text fields for the bullet list button\n *\n * object format:\n * { ariaLabel: string, tooltipText: string, keyboardShortcutText: string }\n */\n bulletListButtonOptions: {\n type: Object,\n default: () => ({\n ariaLabel: 'Toggle bullet list on selected text',\n tooltipText: 'Bullet list',\n keyboardShortcutText: 'Mod + Shift + 8',\n }),\n },\n\n /**\n * descriptive text fields for the ordered list button\n *\n * object format:\n * { ariaLabel: string, tooltipText: string, keyboardShortcutText: string }\n */\n orderedListButtonOptions: {\n type: Object,\n default: () => ({\n ariaLabel: 'Toggle ordered list on selected text',\n tooltipText: 'Ordered list',\n keyboardShortcutText: 'Mod + Shift + 7',\n }),\n },\n\n /**\n * descriptive text fields for the italic button\n *\n * object format:\n * { ariaLabel: string, tooltipText: string, keyboardShortcutText: string }\n */\n blockQuoteButtonOptions: {\n type: Object,\n default: () => ({\n ariaLabel: 'Toggle Blockquote on selected text',\n tooltipText: 'Blockquote',\n keyboardShortcutText: 'Mod + Shift + B',\n }),\n },\n\n /**\n * descriptive text fields for the code button\n *\n * object format:\n * { ariaLabel: string, tooltipText: string, keyboardShortcutText: string }\n */\n codeButtonOptions: {\n type: Object,\n default: () => ({\n ariaLabel: 'Toggle code tag on selected text',\n tooltipText: 'Code',\n keyboardShortcutText: 'Mod + E',\n }),\n },\n\n /**\n * descriptive text fields for the code block button\n *\n * object format:\n * { ariaLabel: string, tooltipText: string, keyboardShortcutText: string }\n */\n codeBlockButtonOptions: {\n type: Object,\n default: () => ({\n ariaLabel: 'Toggle code block on selected text',\n tooltipText: 'Code block',\n keyboardShortcutText: 'Mod + Alt + C',\n }),\n },\n },\n\n emits: [\n /**\n * Fires when send button is clicked\n *\n * @event submit\n * @type {String}\n */\n 'submit',\n\n /**\n * Fires when media is selected from image button\n *\n * @event select-media\n * @type {Array}\n */\n 'select-media',\n\n /**\n * Fires when media is dropped into the message input\n *\n * @event add-media\n * @type {Array}\n */\n 'add-media',\n\n /**\n * Fires when media is pasted into the message input\n *\n * @event paste-media\n * @type {Array}\n */\n 'paste-media',\n\n /**\n * Fires when cancel button is pressed (only on edit mode)\n *\n * @event cancel\n * @type {Boolean}\n */\n 'cancel',\n\n /**\n * Fires when skin tone is selected from the emoji picker\n *\n * @event skin-tone\n * @type {String}\n */\n 'skin-tone',\n\n /**\n * Fires when emoji is selected from the emoji picker\n *\n * @event selected-emoji\n * @type {String}\n */\n 'selected-emoji',\n\n /**\n * Fires when a slash command is selected\n *\n * @event selected-command\n * @type {String}\n */\n 'selected-command',\n\n /**\n * Fires when meeting pill is closed\n *\n * @event meeting-pill-close\n * @type {String}\n */\n 'meeting-pill-close',\n\n /**\n * Event to sync the value with the parent\n * @event update:modelValue\n * @type {String|JSON}\n */\n 'update:modelValue',\n\n /**\n * Emitted when input changes, returns text content only\n * @event text-input\n * @type {String}\n */\n 'text-input',\n ],\n\n data () {\n return {\n // If an ordered list is nested within an unordered list, we only want to show the currently selected list as\n // active. This function performs the logic to determine the farthest active node from the root.\n lastActiveNodes,\n additionalExtensions: [MeetingPill],\n internalInputValue: this.modelValue, // internal input content\n imagePickerFocus: false,\n emojiPickerFocus: false,\n emojiPickerOpened: false,\n isFocused: false,\n linkOptions: {\n class: 'd-link d-c-text d-d-inline-block',\n },\n\n linkDialogOpen: false,\n selectedText: '',\n text: '',\n hideLinkBubbleMenu: false,\n };\n },\n\n computed: {\n\n showSendIcon () {\n return !this.showSend.text;\n },\n\n inputLength () {\n return this.text.length;\n },\n\n displayCharacterLimitWarning () {\n return (\n Boolean(this.showCharacterLimit) &&\n this.showCharacterLimit.count - this.inputLength <=\n this.showCharacterLimit.warning\n );\n },\n\n characterLimitTooltipEnabled () {\n return (\n this.showCharacterLimit.message &&\n this.showCharacterLimit.count - this.inputLength < 0\n );\n },\n\n isSendDisabled () {\n return (\n this.disableSend ||\n (this.showCharacterLimit &&\n this.inputLength > this.showCharacterLimit.count)\n );\n },\n\n computedCloseButtonProps () {\n return {\n ariaLabel: 'Close',\n };\n },\n\n emojiPickerHovered () {\n return this.emojiPickerFocus || this.emojiPickerOpened;\n },\n\n sendIconSize () {\n return '300';\n },\n },\n\n watch: {\n modelValue (newValue) {\n this.internalInputValue = newValue;\n },\n\n emojiPickerOpened (newValue) {\n if (!newValue) {\n this.$refs.richTextEditor?.focusEditor();\n }\n },\n },\n\n created () {\n if (this.modelValue && this.outputFormat === 'text') {\n this.internalInputValue = this.modelValue.replace(/\\n/g, '<br>');\n } else {\n this.internalInputValue = this.modelValue;\n }\n },\n\n methods: {\n removeClassStyleAttrs,\n addClassStyleAttrs,\n\n linkDialogOpened (value) {\n this.linkDialogOpen = value;\n if (value === true) {\n this.initLinkDialog();\n } else {\n this.hideLinkBubbleMenu = false;\n this.$refs.richTextEditor?.focusEditor();\n }\n },\n\n // eslint-disable-next-line complexity\n handleTopbarClick (type) {\n const editor = this.$refs.richTextEditor?.editor;\n // Key is the name returned in the event, value is the name of the TipTap command function to run.\n const typeToCommandMap = {\n bold: () => editor?.chain().focus().toggleBold().run(),\n italic: () => editor?.chain().focus().toggleItalic().run(),\n strike: () => editor?.chain().focus().toggleStrike().run(),\n bulletList: () => editor?.chain().focus().toggleBulletList().run(),\n orderedList: () => editor?.chain().focus().toggleOrderedList().run(),\n blockquote: () => editor?.chain().focus().toggleBlockquote().run(),\n code: () => editor?.chain().focus().toggleCode().run(),\n codeBlock: () => editor?.chain().focus().toggleCodeBlock().run(),\n };\n\n if (editor && typeToCommandMap[type]) {\n typeToCommandMap[type]();\n }\n },\n\n // Checks if the node currently selected is active ex/ the bold button is active if the selected text is bold\n isSelectionActive (type) {\n if (['bulletList', 'orderedList'].includes(type)) {\n return this.lastActiveNodes(this.$refs.richTextEditor?.editor?.state, [{ type: 'bulletList' }, { type: 'orderedList' }]).includes(type) && this.isFocused;\n }\n return this.$refs.richTextEditor?.editor?.isActive(type) && this.isFocused;\n },\n\n initLinkDialog () {\n this.$refs.link.setInitialValues(this.selectedText, this.$refs.richTextEditor?.editor?.getAttributes('link')?.href);\n this.hideLinkBubbleMenu = true;\n this.linkDialogOpen = true;\n },\n\n removeLink () {\n this.$refs.richTextEditor?.removeLink();\n this.linkDialogOpen = false;\n },\n\n setLink (linkText, linkInput) {\n this.$refs.richTextEditor.setLink(\n linkInput, linkText, this.linkOptions, EDITOR_SUPPORTED_LINK_PROTOCOLS, EDITOR_DEFAULT_LINK_PREFIX,\n );\n this.linkDialogOpen = false;\n },\n\n // Mousedown instead of click because it fires before the blur event.\n onMousedown (e) {\n const isWithinInput = returnFirstEl(this.$refs.richTextEditor.$el)\n .querySelector('.tiptap')\n .contains(e.target);\n\n // If the click is not within the tiptap rich text editor input itself, but still within the wrapping div,\n // focus the editor.\n if (!isWithinInput) {\n // Prevent default prevents blurring the rich text editor input when it is already focused.\n e.preventDefault();\n this.$refs.richTextEditor.focusEditor();\n }\n },\n\n onDrop (e) {\n const dt = e.dataTransfer;\n const files = Array.from(dt.files);\n this.$emit('add-media', files);\n },\n\n onPaste (e) {\n if (e.clipboardData.files.length) {\n e.stopPropagation();\n e.preventDefault();\n const files = [...e.clipboardData.files];\n this.$emit('paste-media', files);\n }\n },\n\n onSkinTone (skinTone) {\n this.$emit('skin-tone', skinTone);\n },\n\n onSelectEmoji (emoji, close) {\n if (!emoji) {\n return;\n }\n\n if (!emoji.shift_key) {\n close();\n }\n\n // Insert emoji into the editor\n this.$refs.richTextEditor.editor.commands.insertContent({\n type: 'emoji',\n attrs: {\n code: emoji.shortname,\n },\n });\n this.$emit('selected-emoji', emoji);\n },\n\n onSelectImage () {\n this.$refs.messageInputImageUpload.$refs.input.click();\n },\n\n onImageUpload () {\n this.$emit(\n 'select-media',\n this.$refs.messageInputImageUpload.$refs.input.files,\n );\n },\n\n toggleEmojiPicker () {\n this.emojiPickerOpened = !this.emojiPickerOpened;\n },\n\n onSend () {\n if (this.isSendDisabled) {\n return;\n }\n this.$emit('submit', this.internalInputValue);\n },\n\n onCancel () {\n this.$emit('cancel');\n },\n\n onInput (event) {\n this.$emit('update:modelValue', event);\n },\n\n onTextInput (event) {\n this.text = event;\n this.$emit('text-input', event);\n },\n },\n};\n</script>\n"],"names":["_sfc_main","NodeViewWrapper","DtItemLayout","DtIconClose","DtButton","DtIconVideo","nodeViewProps","e","_hoisted_1","_hoisted_2","_createBlock","_component_node_view_wrapper","_withCtx","_createVNode","_component_dt_item_layout","_createElementVNode","_component_dt_icon_video","_component_dt_button","_ctx","$options","_component_dt_icon_close","_createTextVNode","Node","VueNodeViewRenderer","MeetingPill","node","HTMLAttributes","mergeAttributes","DtEmojiPicker","DtInput","DtPopover","DtRecipeMessageInputTopbar","DtRecipeMessageInputLink","DtRichTextEditor","DtTooltip","DtStack","DtIconImage","DtIconVerySatisfied","DtIconSatisfied","DtIconSend","autoFocus","RICH_TEXT_EDITOR_AUTOFOCUS_TYPES","outputFormat","RICH_TEXT_EDITOR_OUTPUT_FORMATS","emojiPickerProps","prop","lastActiveNodes","newValue","_a","removeClassStyleAttrs","addClassStyleAttrs","value","type","editor","typeToCommandMap","_b","_d","_c","linkText","linkInput","EDITOR_SUPPORTED_LINK_PROTOCOLS","EDITOR_DEFAULT_LINK_PREFIX","returnFirstEl","dt","files","skinTone","emoji","close","event","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_mergeProps","_cache","_withModifiers","args","_renderSlot","$props","_component_dt_recipe_message_input_topbar","$data","_component_dt_recipe_message_input_link","_createCommentVNode","_normalizeStyle","_component_dt_rich_text_editor","$event","_component_dt_stack","_component_dt_icon_image","_component_dt_input","_component_dt_popover","attrs","_component_dt_icon_very_satisfied","_component_dt_icon_satisfied","_component_dt_emoji_picker","_component_dt_tooltip","_toDisplayString","_normalizeClass","_createSlots","_hoisted_5","_component_dt_icon_send"],"mappings":"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"}