@dialpad/dialtone 9.116.0 → 9.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/dist/css/dialtone-default-theme.css +4 -4
- package/dist/css/dialtone-default-theme.min.css +1 -1
- package/dist/css/dialtone-docs.json +1 -1
- package/dist/css/tokens/tokens-base-dark.css +1 -1
- package/dist/css/tokens/tokens-base-deca-dark.css +1 -1
- package/dist/css/tokens/tokens-base-deca-light.css +1 -1
- package/dist/css/tokens/tokens-base-light.css +1 -1
- package/dist/css/tokens/tokens-debug-base.css +1 -1
- package/dist/css/tokens/tokens-debug-dp.css +3 -3
- package/dist/css/tokens/tokens-deca-dark.css +3 -3
- package/dist/css/tokens/tokens-deca-light.css +3 -3
- package/dist/css/tokens/tokens-dp-dark.css +3 -3
- package/dist/css/tokens/tokens-dp-light.css +3 -3
- package/dist/css/tokens/tokens-expressive-dark.css +3 -3
- package/dist/css/tokens/tokens-expressive-light.css +3 -3
- package/dist/css/tokens/tokens-expressive-sm-dark.css +3 -3
- package/dist/css/tokens/tokens-expressive-sm-light.css +3 -3
- package/dist/css/tokens/tokens-tmo-dark.css +3 -3
- package/dist/css/tokens/tokens-tmo-light.css +3 -3
- package/dist/css/tokens-docs.json +1 -1
- package/dist/tokens/css/tokens-base-dark.css +1 -1
- package/dist/tokens/css/tokens-base-deca-dark.css +1 -1
- package/dist/tokens/css/tokens-base-deca-light.css +1 -1
- package/dist/tokens/css/tokens-base-light.css +1 -1
- package/dist/tokens/css/tokens-debug-base.css +1 -1
- package/dist/tokens/css/tokens-debug-dp.css +3 -3
- package/dist/tokens/css/tokens-deca-dark.css +3 -3
- package/dist/tokens/css/tokens-deca-light.css +3 -3
- package/dist/tokens/css/tokens-dp-dark.css +3 -3
- package/dist/tokens/css/tokens-dp-light.css +3 -3
- package/dist/tokens/css/tokens-expressive-dark.css +3 -3
- package/dist/tokens/css/tokens-expressive-light.css +3 -3
- package/dist/tokens/css/tokens-expressive-sm-dark.css +3 -3
- package/dist/tokens/css/tokens-expressive-sm-light.css +3 -3
- package/dist/tokens/css/tokens-tmo-dark.css +3 -3
- package/dist/tokens/css/tokens-tmo-light.css +3 -3
- package/dist/tokens/doc.json +18205 -18205
- package/dist/tokens/less/tokens-base-dark.less +1 -1
- package/dist/tokens/less/tokens-base-deca-dark.less +1 -1
- package/dist/tokens/less/tokens-base-deca-light.less +1 -1
- package/dist/tokens/less/tokens-base-light.less +1 -1
- package/dist/tokens/less/tokens-deca-dark.less +3 -3
- package/dist/tokens/less/tokens-deca-light.less +3 -3
- package/dist/tokens/less/tokens-dp-dark.less +3 -3
- package/dist/tokens/less/tokens-dp-light.less +3 -3
- package/dist/tokens/less/tokens-expressive-dark.less +3 -3
- package/dist/tokens/less/tokens-expressive-light.less +3 -3
- package/dist/tokens/less/tokens-expressive-sm-dark.less +3 -3
- package/dist/tokens/less/tokens-expressive-sm-light.less +3 -3
- package/dist/tokens/less/tokens-tmo-dark.less +3 -3
- package/dist/tokens/less/tokens-tmo-light.less +3 -3
- package/dist/tokens/themes/chunks/tokens-base-dark-CKvoqrK2.js +1 -0
- package/dist/tokens/themes/chunks/tokens-base-dark-CLL9Sz8C.js +4 -0
- package/dist/tokens/themes/chunks/tokens-base-light-C7afXvK5.js +4 -0
- package/dist/tokens/themes/chunks/tokens-base-light-DgGeYJGp.js +1 -0
- package/dist/tokens/themes/debug.cjs +1 -1
- package/dist/tokens/themes/debug.js +1 -1
- package/dist/tokens/themes/dp-dark.cjs +1 -1
- package/dist/tokens/themes/dp-dark.js +2 -2
- package/dist/tokens/themes/dp-deca-dark.cjs +1 -1
- package/dist/tokens/themes/dp-deca-dark.js +1 -1
- package/dist/tokens/themes/dp-deca-light.cjs +1 -1
- package/dist/tokens/themes/dp-deca-light.js +1 -1
- package/dist/tokens/themes/dp-light.cjs +1 -1
- package/dist/tokens/themes/dp-light.js +2 -2
- package/dist/tokens/themes/expressive-dark.cjs +1 -1
- package/dist/tokens/themes/expressive-dark.js +2 -2
- package/dist/tokens/themes/expressive-light.cjs +1 -1
- package/dist/tokens/themes/expressive-light.js +2 -2
- package/dist/tokens/themes/expressive-sm-dark.cjs +1 -1
- package/dist/tokens/themes/expressive-sm-dark.js +2 -2
- package/dist/tokens/themes/expressive-sm-light.cjs +1 -1
- package/dist/tokens/themes/expressive-sm-light.js +2 -2
- package/dist/tokens/themes/tmo-dark.cjs +1 -1
- package/dist/tokens/themes/tmo-dark.js +2 -2
- package/dist/tokens/themes/tmo-light.cjs +1 -1
- package/dist/tokens/themes/tmo-light.js +2 -2
- package/dist/tokens/tokens-base-dark.json +1 -1
- package/dist/tokens/tokens-base-deca-dark.json +1 -1
- package/dist/tokens/tokens-base-deca-light.json +1 -1
- package/dist/tokens/tokens-base-light.json +1 -1
- package/dist/tokens/tokens-deca-dark.json +3 -3
- package/dist/tokens/tokens-deca-light.json +3 -3
- package/dist/tokens/tokens-dp-dark.json +3 -3
- package/dist/tokens/tokens-dp-light.json +3 -3
- package/dist/tokens/tokens-expressive-dark.json +3 -3
- package/dist/tokens/tokens-expressive-light.json +3 -3
- package/dist/tokens/tokens-expressive-sm-dark.json +3 -3
- package/dist/tokens/tokens-expressive-sm-light.json +3 -3
- package/dist/tokens/tokens-tmo-dark.json +3 -3
- package/dist/tokens/tokens-tmo-light.json +3 -3
- package/dist/vue2/lib/editor/editor.cjs +1 -1
- package/dist/vue2/lib/editor/editor.cjs.map +1 -1
- package/dist/vue2/lib/editor/editor.js +53 -53
- package/dist/vue2/lib/editor/editor.js.map +1 -1
- package/dist/vue3/lib/editor/editor.cjs +1 -1
- package/dist/vue3/lib/editor/editor.cjs.map +1 -1
- package/dist/vue3/lib/editor/editor.js +13 -13
- package/dist/vue3/lib/editor/editor.js.map +1 -1
- package/package.json +3 -3
- package/dist/tokens/themes/chunks/tokens-base-dark-B42c8NRe.js +0 -1
- package/dist/tokens/themes/chunks/tokens-base-dark-D3XlzClW.js +0 -4
- package/dist/tokens/themes/chunks/tokens-base-light-5p3ZOPKU.js +0 -1
- package/dist/tokens/themes/chunks/tokens-base-light-C_G4p7UU.js +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.cjs","sources":["../../../recipes/conversation_view/editor/editor.vue"],"sourcesContent":["<template>\n <div\n\n class=\"d-recipe-editor\"\n data-qa=\"dt-recipe-editor\"\n role=\"presentation\"\n @click=\"$refs.richTextEditor.focusEditor()\"\n >\n <!-- Section for the top UI -->\n <dt-stack\n class=\"d-recipe-editor__top-bar\"\n direction=\"row\"\n gap=\"450\"\n >\n <dt-stack\n v-for=\"buttonGroup in buttonGroups\"\n :key=\"buttonGroup.key\"\n direction=\"row\"\n gap=\"300\"\n >\n <dt-tooltip\n v-for=\"button in buttonGroup.buttonGroup\"\n :key=\"getButtonKey(buttonGroup.key, button.selector)\"\n :message=\"button.tooltipMessage\"\n placement=\"top\"\n >\n <template #anchor>\n <dt-button\n :ref=\"(el) => { buttonRefMap[getButtonRef(buttonGroup.key, button.selector)] = el }\"\n :active=\"$refs.richTextEditor?.editor?.isActive(button.selector)\"\n :aria-label=\"button.tooltipMessage\"\n :data-qa=\"button.dataQA\"\n :tabindex=\"canFocus(getButtonRef(buttonGroup.key, button.selector)) ? 0 : -1\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"xs\"\n @click=\"button.onClick()\"\n @keydown.right.stop=\"shiftActionBarFocusRight\"\n @keydown.left.stop=\"shiftActionBarFocusLeft\"\n >\n <template #icon>\n <component\n :is=\"button.icon\"\n size=\"200\"\n />\n </template>\n <span v-if=\"button.label\">{{ button.label }}</span>\n </dt-button>\n </template>\n </dt-tooltip>\n <div class=\"d-recipe-editor__button-group-divider\" />\n </dt-stack>\n <dt-stack\n v-if=\"linkButton.showBtn\"\n direction=\"row\"\n gap=\"300\"\n >\n <dt-popover\n :open.sync=\"showLinkInput\"\n :show-close-button=\"false\"\n :visually-hidden-close=\"true\"\n :visually-hidden-close-label=\"'Close link input popover'\"\n data-qa=\"dt-recipe-editor-link-input-popover\"\n padding=\"none\"\n placement=\"bottom-start\"\n @click=\"onInputFocus\"\n @opened=\"updateInput\"\n @click.native.stop=\"onInputFocus\"\n >\n <template #anchor>\n <dt-tooltip\n :key=\"linkButton.key\"\n :message=\"linkButton.tooltipMessage\"\n placement=\"top\"\n >\n <template #anchor>\n <dt-button\n :ref=\"(el) => { buttonRefMap[getButtonRef('custom', 'link')] = el }\"\n :active=\"$refs.richTextEditor?.editor?.isActive(linkButton.selector)\"\n :aria-label=\"linkButton.tooltipMessage\"\n :data-qa=\"linkButton.dataQA\"\n :tabindex=\"canFocus(getButtonRef('custom', 'link')) ? 0 : -1\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"xs\"\n @click=\"linkButton.onClick()\"\n @keydown.right.stop=\"shiftActionBarFocusRight\"\n @keydown.left.stop=\"shiftActionBarFocusLeft\"\n >\n <template #icon>\n <component\n :is=\"linkButton.icon\"\n size=\"200\"\n />\n </template>\n </dt-button>\n </template>\n </dt-tooltip>\n </template>\n\n <template #content>\n <div class=\"d-recipe-editor__popover-content\">\n <span\n v-if=\"showAddLink.setLinkTitle.length > 0\"\n >\n {{ showAddLink.setLinkTitle }}\n </span>\n <dt-input\n v-model=\"linkInput\"\n :input-aria-label=\"showAddLink.setLinkInputAriaLabel\"\n :placeholder=\"setLinkPlaceholder\"\n data-qa=\"dt-recipe-editor-link-input\"\n input-wrapper-class=\"d-recipe-editor-link__input-wrapper\"\n @click=\"onInputFocus\"\n @focus=\"onInputFocus\"\n @click.native.stop=\"onInputFocus\"\n @keydown.enter=\"setLink\"\n />\n </div>\n </template>\n <template #footerContent>\n <dt-stack\n direction=\"row\"\n gap=\"300\"\n class=\"d-recipe-editor__popover-footer\"\n >\n <dt-button\n :aria-label=\"removeLinkButton.ariaLabel\"\n data-qa=\"dt-recipe-editor-remove-link-btn\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"sm\"\n @click=\"removeLink\"\n >\n {{ removeLinkButton.label }}\n </dt-button>\n <dt-button\n :aria-label=\"cancelSetLinkButton.ariaLabel\"\n data-qa=\"dt-recipe-editor-set-link-cancel-btn\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"sm\"\n @click=\"closeLinkInput\"\n >\n {{ cancelSetLinkButton.label }}\n </dt-button>\n <dt-button\n :aria-label=\"confirmSetLinkButton.ariaLabel\"\n data-qa=\"dt-recipe-editor-set-link-confirm-btn\"\n size=\"sm\"\n @click=\"setLink\"\n >\n {{ confirmSetLinkButton.label }}\n </dt-button>\n </dt-stack>\n </template>\n </dt-popover>\n </dt-stack>\n </dt-stack>\n\n <!-- Some wrapper to restrict the height and show the scrollbar -->\n <div\n :style=\"{ 'max-height': maxHeight }\"\n class=\"d-recipe-editor__content\"\n >\n <dt-rich-text-editor\n ref=\"richTextEditor\"\n v-model=\"internalInputValue\"\n :allow-inline-images=\"true\"\n :allow-line-breaks=\"true\"\n :hide-link-bubble-menu=\"true\"\n :auto-focus=\"autoFocus\"\n :editable=\"editable\"\n :input-aria-label=\"inputAriaLabel\"\n :input-class=\"`d-recipe-editor__content-input ${inputClass}`\"\n :link=\"true\"\n :output-format=\"htmlOutputFormat\"\n :placeholder=\"placeholder\"\n :use-div-tags=\"useDivTags\"\n data-qa=\"dt-rich-text-editor\"\n v-bind=\"$attrs\"\n @text-input=\"onTextInput\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @input=\"onInput($event)\"\n />\n </div>\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 {\n EDITOR_SUPPORTED_LINK_PROTOCOLS,\n EDITOR_DEFAULT_LINK_PREFIX,\n} from './editor_constants.js';\nimport { DtButton } from '@/components/button';\nimport { DtPopover } from '@/components/popover';\nimport { DtStack } from '@/components/stack';\nimport { DtInput } from '@/components/input';\nimport { DtTooltip } from '@/components/tooltip';\nimport {\n DtIconAlignCenter,\n DtIconAlignJustify,\n DtIconAlignLeft,\n DtIconAlignRight,\n DtIconBold,\n DtIconCodeBlock,\n DtIconImage,\n DtIconItalic,\n DtIconLightningBolt,\n DtIconLink2,\n DtIconListBullet,\n DtIconListOrdered,\n DtIconQuote,\n DtIconStrikethrough,\n DtIconUnderline,\n} from '@dialpad/dialtone-icons/vue2';\nimport { ref } from 'vue';\n\nexport default {\n name: 'DtRecipeEditor',\n\n components: {\n DtRichTextEditor,\n DtButton,\n DtPopover,\n DtStack,\n DtInput,\n DtTooltip,\n DtIconLightningBolt,\n DtIconBold,\n DtIconItalic,\n DtIconUnderline,\n DtIconStrikethrough,\n DtIconListBullet,\n DtIconListOrdered,\n DtIconAlignLeft,\n DtIconAlignCenter,\n DtIconAlignRight,\n DtIconAlignJustify,\n DtIconQuote,\n DtIconCodeBlock,\n DtIconLink2,\n DtIconImage,\n },\n\n inheritAttrs: false,\n\n props: {\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 value: {\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 * 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 * Placeholder text\n */\n placeholder: {\n type: String,\n default: '',\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 /**\n * Confirm set link button defaults.\n */\n confirmSetLinkButton: {\n type: Object,\n default: () => ({ label: 'Confirm', ariaLabel: 'Confirm set link' }),\n },\n\n /**\n * Remove link button defaults.\n */\n removeLinkButton: {\n type: Object,\n default: () => ({ label: 'Remove', ariaLabel: 'Remove link' }),\n },\n\n /**\n * Cancel set link button defaults.\n */\n cancelSetLinkButton: {\n type: Object,\n default: () => ({ label: 'Cancel', ariaLabel: 'Cancel set link' }),\n },\n\n /**\n * Placeholder text for the set link input field\n */\n setLinkPlaceholder: {\n type: String,\n default: '',\n },\n\n /**\n * Show button to render text as bold\n */\n showBoldButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to render text in italics\n */\n showItalicsButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to underline text\n */\n showUnderlineButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to strike text\n */\n showStrikeButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to render list items\n */\n showListItemsButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to render ordered list items\n */\n showOrderedListButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to align text to the left\n */\n showAlignLeftButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to align text to the center\n */\n showAlignCenterButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to align text to the right\n */\n showAlignRightButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to justify text\n */\n showAlignJustifyButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to add quote format to text\n */\n showQuoteButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to add code block\n */\n showCodeBlockButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to handle quick replies\n */\n showQuickRepliesButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to add an inline image\n */\n showInlineImageButton: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Show add link default config.\n */\n showAddLink: {\n type: Object,\n default: () => ({\n showAddLinkButton: true,\n setLinkTitle: 'Add a link',\n setLinkInputAriaLabel: 'Input field to add link',\n }),\n },\n\n /**\n * Use div tags instead of paragraph tags to show text\n */\n useDivTags: {\n type: Boolean,\n default: false,\n },\n },\n\n emits: [\n /**\n * Native focus event\n * @event input\n * @type {String|JSON}\n */\n 'focus',\n\n /**\n * Native blur event\n * @event input\n * @type {String|JSON}\n */\n 'blur',\n\n /**\n * Native input event\n * @event input\n * @type {String|JSON}\n */\n 'input',\n\n /**\n * Quick replies button\n * pressed event\n * @event quick-replies-click\n */\n 'quick-replies-click',\n\n /**\n * Emit when inline image button is clicked\n * @event inline-image-click\n */\n 'inline-image-click',\n\n /**\n * Emit when text content changes (not raw html)\n */\n 'text-input',\n ],\n\n data () {\n return {\n internalInputValue: this.value, // internal input content\n hasFocus: false,\n\n linkOptions: {\n class: 'd-recipe-editor__link',\n },\n\n showLinkInput: false,\n linkInput: '',\n currentButtonRefIndex: 0,\n buttonRefMap: ref({}),\n };\n },\n\n computed: {\n inputLength () {\n return this.internalInputValue.length;\n },\n\n htmlOutputFormat () {\n return RICH_TEXT_EDITOR_OUTPUT_FORMATS[2];\n },\n\n showingTextFormatButtons () {\n return this.showBoldButton || this.showItalicsButton || this.showStrikeButton || this.showUnderlineButton;\n },\n\n showingAlignmentButtons () {\n return this.showAlignLeftButton || this.showAlignCenterButton ||\n this.showAlignRightButton || this.showAlignJustifyButton;\n },\n\n showingListButtons () {\n return this.showListItemsButton || this.showOrderedListButton;\n },\n\n orderedRefs () {\n const refs = this.buttonGroups.reduce(function (acc, buttonData) {\n buttonData.buttonGroup.forEach(button => {\n acc.push(this.getButtonRef(buttonData.key, button.selector));\n }, this);\n return acc;\n }.bind(this), []);\n refs.push(this.getButtonRef('custom', 'link'));\n return refs;\n },\n\n buttonGroups () {\n const individualButtonStacks = this.individualButtons.map(buttonData => ({\n key: buttonData.selector,\n buttonGroup: [buttonData],\n }));\n return [\n { key: 'new', buttonGroup: this.newButtons },\n { key: 'format', buttonGroup: this.textFormatButtons },\n { key: 'alignment', buttonGroup: this.alignmentButtons },\n { key: 'list', buttonGroup: this.listButtons },\n ...individualButtonStacks,\n ].filter(buttonGroupData => buttonGroupData.buttonGroup.length > 0);\n },\n\n newButtons () {\n return [\n {\n showBtn: this.showQuickRepliesButton,\n label: 'Quick reply',\n selector: 'quickReplies',\n icon: DtIconLightningBolt,\n dataQA: 'dt-recipe-editor-quick-replies-btn',\n tooltipMessage: 'Quick Reply',\n onClick: this.onQuickRepliesClick,\n },\n ].filter(button => button.showBtn);\n },\n\n textFormatButtons () {\n return [\n {\n showBtn: this.showBoldButton,\n selector: 'bold',\n icon: DtIconBold,\n dataQA: 'dt-recipe-editor-bold-btn',\n tooltipMessage: 'Bold',\n onClick: this.onBoldTextToggle,\n },\n {\n showBtn: this.showItalicsButton,\n selector: 'italic',\n icon: DtIconItalic,\n dataQA: 'dt-recipe-editor-italics-btn',\n tooltipMessage: 'Italics',\n onClick: this.onItalicTextToggle,\n },\n {\n showBtn: this.showUnderlineButton,\n selector: 'underline',\n icon: DtIconUnderline,\n dataQA: 'dt-recipe-editor-underline-btn',\n tooltipMessage: 'Underline',\n onClick: this.onUnderlineTextToggle,\n },\n {\n showBtn: this.showStrikeButton,\n selector: 'strike',\n icon: DtIconStrikethrough,\n dataQA: 'dt-recipe-editor-strike-btn',\n tooltipMessage: 'Strike',\n onClick: this.onStrikethroughTextToggle,\n },\n ].filter(button => button.showBtn);\n },\n\n alignmentButtons () {\n return [\n {\n showBtn: this.showAlignLeftButton,\n selector: { textAlign: 'left' },\n icon: DtIconAlignLeft,\n dataQA: 'dt-recipe-editor-align-left-btn',\n tooltipMessage: 'Align Left',\n onClick: () => this.onTextAlign('left'),\n },\n {\n showBtn: this.showAlignCenterButton,\n selector: { textAlign: 'center' },\n icon: DtIconAlignCenter,\n dataQA: 'dt-recipe-editor-align-center-btn',\n tooltipMessage: 'Align Center',\n onClick: () => this.onTextAlign('center'),\n },\n {\n showBtn: this.showAlignRightButton,\n selector: { textAlign: 'right' },\n icon: DtIconAlignRight,\n dataQA: 'dt-recipe-editor-align-right-btn',\n tooltipMessage: 'Align Right',\n onClick: () => this.onTextAlign('right'),\n },\n {\n showBtn: this.showAlignJustifyButton,\n selector: { textAlign: 'justify' },\n icon: DtIconAlignJustify,\n dataQA: 'dt-recipe-editor-align-justify-btn',\n tooltipMessage: 'Align Justify',\n onClick: () => this.onTextAlign('justify'),\n },\n ].filter(button => button.showBtn);\n },\n\n listButtons () {\n return [\n {\n showBtn: this.showListItemsButton,\n selector: 'bulletList',\n icon: DtIconListBullet,\n dataQA: 'dt-recipe-editor-list-items-btn',\n tooltipMessage: 'Bullet List',\n onClick: this.onBulletListToggle,\n },\n {\n showBtn: this.showOrderedListButton,\n selector: 'orderedList',\n icon: DtIconListOrdered,\n dataQA: 'dt-recipe-editor-ordered-list-items-btn',\n tooltipMessage: 'Ordered List',\n onClick: this.onOrderedListToggle,\n },\n ].filter(button => button.showBtn);\n },\n\n individualButtons () {\n return [\n {\n showBtn: this.showQuoteButton,\n selector: 'blockquote',\n icon: DtIconQuote,\n dataQA: 'dt-recipe-editor-blockquote-btn',\n tooltipMessage: 'Quote',\n onClick: this.onBlockquoteToggle,\n },\n {\n showBtn: this.showCodeBlockButton,\n selector: 'codeBlock',\n icon: DtIconCodeBlock,\n dataQA: 'dt-recipe-editor-code-block-btn',\n tooltipMessage: 'Code',\n onClick: this.onCodeBlockToggle,\n },\n {\n showBtn: this.showInlineImageButton,\n selector: 'image',\n icon: DtIconImage,\n dataQA: 'dt-recipe-editor-inline-image-btn',\n tooltipMessage: 'Image',\n onClick: this.onInsertInlineImageClick,\n },\n ].filter(button => button.showBtn);\n },\n\n linkButton () {\n return {\n showBtn: this.showAddLink.showAddLinkButton,\n selector: 'link',\n icon: DtIconLink2,\n dataQA: 'dt-recipe-editor-add-link-btn',\n tooltipMessage: 'Link',\n onClick: this.openLinkInput,\n };\n },\n\n },\n\n watch: {\n value (newValue) {\n this.internalInputValue = newValue;\n },\n },\n\n methods: {\n onInputFocus (event) {\n event?.stopPropagation();\n },\n\n removeLink () {\n this.$refs.richTextEditor?.editor?.chain()?.focus()?.unsetLink()?.run();\n this.closeLinkInput();\n },\n\n setLink (event) {\n const editor = this.$refs.richTextEditor?.editor;\n event?.preventDefault();\n event?.stopPropagation();\n\n if (!this.linkInput) {\n // If link text is set to empty string,\n // remove any existing links.\n this.removeLink();\n return;\n }\n\n // Check if input matches any of the supported link formats\n const prefix = EDITOR_SUPPORTED_LINK_PROTOCOLS.find(prefixRegex => prefixRegex.test(this.linkInput));\n\n if (!prefix) {\n // If no matching pattern is found, prepend default prefix\n this.linkInput = `${EDITOR_DEFAULT_LINK_PREFIX}${this.linkInput}`;\n }\n\n const selection = editor?.view?.state?.selection;\n\n if (selection.anchor === selection.head) {\n // If no text has been selected, manually insert the link text.\n // Do not rely on link options set through DtRichTextEditor\n // component, because they clash with these and cause issues.\n editor\n .chain()\n .focus()\n .insertContentAt(\n selection.anchor,\n `<a class=\"${this.linkOptions.class}\" href=${this.linkInput}>${this.linkInput}</a>`,\n )\n .run();\n } else {\n // Set or edit the link\n editor\n .chain()\n .focus()\n .extendMarkRange('link')\n .setLink({ href: this.linkInput, class: this.linkOptions.class })\n .run();\n }\n\n this.closeLinkInput();\n },\n\n openLinkInput () {\n this.showLinkInput = true;\n },\n\n updateInput (openedInput) {\n if (!openedInput) {\n return this.closeLinkInput();\n }\n this.linkInput = this.$refs.richTextEditor?.editor?.getAttributes('link')?.href;\n },\n\n closeLinkInput () {\n this.showLinkInput = false;\n this.linkInput = '';\n this.$refs.richTextEditor.editor?.chain().focus();\n },\n\n onBoldTextToggle () {\n this.$refs.richTextEditor?.editor?.chain().focus().toggleBold().run();\n },\n\n onItalicTextToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleItalic().run();\n },\n\n onUnderlineTextToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleUnderline().run();\n },\n\n onStrikethroughTextToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleStrike().run();\n },\n\n onTextAlign (alignment) {\n if (this.$refs.richTextEditor?.editor?.isActive({ textAlign: alignment })) {\n // If this alignment type is already set here, unset it\n return this.$refs.richTextEditor?.editor.chain().focus().unsetTextAlign().run();\n }\n this.$refs.richTextEditor?.editor.chain().focus().setTextAlign(alignment).run();\n },\n\n onBulletListToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleBulletList().run();\n },\n\n onOrderedListToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleOrderedList().run();\n },\n\n onCodeBlockToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleCodeBlock().run();\n },\n\n onQuickRepliesClick () {\n this.$emit('quick-replies-click');\n },\n\n onInsertInlineImageClick () {\n this.$emit('inline-image-click');\n },\n\n insertInlineImage (imageUrl) {\n this.$refs.richTextEditor?.editor.chain().focus().setImage({ src: imageUrl }).run();\n },\n\n onBlockquoteToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleBlockquote().run();\n },\n\n insertInMessageBody (messageContent) {\n this.$refs.richTextEditor?.editor.chain().focus().insertContent(messageContent).run();\n },\n\n setCursorPosition (position = null) {\n this.$refs.richTextEditor?.editor.chain().focus(position).run();\n },\n\n onTextInput (event) {\n this.$emit('text-input', event);\n },\n\n onFocus (event) {\n this.hasFocus = true;\n this.$emit('focus', event);\n },\n\n onBlur (event) {\n this.hasFocus = false;\n this.$emit('blur', event);\n },\n\n onInput (event) {\n this.$emit('input', event);\n },\n\n getButtonKey (key, selector) {\n return `${key}-${JSON.stringify(selector)}`;\n },\n\n // Unique Button Ref Key to identify ref\n getButtonRef (key, selector) {\n return `${this.getButtonKey(key, selector)}-ref`;\n },\n\n /**\n * Determines if an element in the action bar button list is focusable with tab key\n * @param {string} refKey - unique identifier for the ref element in DOM\n */\n canFocus (refKey) {\n return refKey === this.orderedRefs[this.currentButtonRefIndex];\n },\n\n shiftActionBarFocusRight () {\n this.shiftButtonRefIndex(1);\n },\n\n shiftActionBarFocusLeft () {\n this.shiftButtonRefIndex(-1);\n },\n\n shiftButtonRefIndex (shiftAmount) {\n const previousRef = this.buttonRefMap[this.orderedRefs[this.currentButtonRefIndex]];\n const index = (this.currentButtonRefIndex + shiftAmount) % this.orderedRefs.length;\n this.currentButtonRefIndex = index >= 0 ? index : this.orderedRefs.length + index;\n const currentRef = this.buttonRefMap[this.orderedRefs[this.currentButtonRefIndex]];\n previousRef.$el.blur();\n currentRef.$el.focus();\n },\n },\n};\n</script>\n"],"names":["_sfc_main","DtRichTextEditor","DtButton","DtPopover","DtStack","DtInput","DtTooltip","DtIconLightningBolt","DtIconBold","DtIconItalic","DtIconUnderline","DtIconStrikethrough","DtIconListBullet","DtIconListOrdered","DtIconAlignLeft","DtIconAlignCenter","DtIconAlignRight","DtIconAlignJustify","DtIconQuote","DtIconCodeBlock","DtIconLink2","DtIconImage","autoFocus","RICH_TEXT_EDITOR_AUTOFOCUS_TYPES","ref","RICH_TEXT_EDITOR_OUTPUT_FORMATS","refs","acc","buttonData","button","individualButtonStacks","buttonGroupData","newValue","event","_e","_d","_c","_b","_a","editor","EDITOR_SUPPORTED_LINK_PROTOCOLS","prefixRegex","EDITOR_DEFAULT_LINK_PREFIX","selection","openedInput","alignment","imageUrl","messageContent","position","key","selector","refKey","shiftAmount","previousRef","index","currentRef"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"editor.cjs","sources":["../../../recipes/conversation_view/editor/editor.vue"],"sourcesContent":["<template>\n <div\n\n class=\"d-recipe-editor\"\n data-qa=\"dt-recipe-editor\"\n role=\"presentation\"\n @click=\"$refs.richTextEditor.focusEditor()\"\n >\n <!-- Section for the top UI -->\n <dt-stack\n class=\"d-recipe-editor__top-bar\"\n direction=\"row\"\n gap=\"450\"\n >\n <dt-stack\n v-for=\"buttonGroup in buttonGroups\"\n :key=\"buttonGroup.key\"\n direction=\"row\"\n gap=\"300\"\n >\n <dt-tooltip\n v-for=\"button in buttonGroup.buttonGroup\"\n :key=\"getButtonKey(buttonGroup.key, button.selector)\"\n :message=\"button.tooltipMessage\"\n placement=\"top\"\n >\n <template #anchor>\n <dt-button\n :ref=\"(el) => { buttonRefMap[getButtonRef(buttonGroup.key, button.selector)] = el }\"\n :active=\"$refs.richTextEditor?.editor?.isActive(button.selector)\"\n :aria-label=\"button.tooltipMessage\"\n :data-qa=\"button.dataQA\"\n :tabindex=\"canFocus(getButtonRef(buttonGroup.key, button.selector)) ? 0 : -1\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"xs\"\n @click=\"button.onClick()\"\n @keydown.right.stop=\"shiftActionBarFocusRight\"\n @keydown.left.stop=\"shiftActionBarFocusLeft\"\n >\n <template #icon>\n <component\n :is=\"button.icon\"\n size=\"200\"\n />\n </template>\n <span v-if=\"button.label\">{{ button.label }}</span>\n </dt-button>\n </template>\n </dt-tooltip>\n <div class=\"d-recipe-editor__button-group-divider\" />\n </dt-stack>\n <dt-stack\n v-if=\"linkButton.showBtn\"\n direction=\"row\"\n gap=\"300\"\n >\n <dt-popover\n :open.sync=\"showLinkInput\"\n :show-close-button=\"false\"\n :visually-hidden-close=\"true\"\n :visually-hidden-close-label=\"'Close link input popover'\"\n data-qa=\"dt-recipe-editor-link-input-popover\"\n padding=\"none\"\n placement=\"bottom-start\"\n @click=\"onInputFocus\"\n @opened=\"updateInput\"\n @click.native.stop=\"onInputFocus\"\n >\n <template #anchor>\n <dt-tooltip\n :key=\"linkButton.key\"\n :message=\"linkButton.tooltipMessage\"\n placement=\"top\"\n >\n <template #anchor>\n <dt-button\n :ref=\"(el) => { buttonRefMap[getButtonRef('custom', 'link')] = el }\"\n :active=\"$refs.richTextEditor?.editor?.isActive(linkButton.selector)\"\n :aria-label=\"linkButton.tooltipMessage\"\n :data-qa=\"linkButton.dataQA\"\n :tabindex=\"canFocus(getButtonRef('custom', 'link')) ? 0 : -1\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"xs\"\n @click=\"linkButton.onClick()\"\n @keydown.right.stop=\"shiftActionBarFocusRight\"\n @keydown.left.stop=\"shiftActionBarFocusLeft\"\n >\n <template #icon>\n <component\n :is=\"linkButton.icon\"\n size=\"200\"\n />\n </template>\n </dt-button>\n </template>\n </dt-tooltip>\n </template>\n\n <template #content>\n <div class=\"d-recipe-editor__popover-content\">\n <span\n v-if=\"showAddLink.setLinkTitle.length > 0\"\n >\n {{ showAddLink.setLinkTitle }}\n </span>\n <dt-input\n v-model=\"linkInput\"\n :input-aria-label=\"showAddLink.setLinkInputAriaLabel\"\n :placeholder=\"setLinkPlaceholder\"\n data-qa=\"dt-recipe-editor-link-input\"\n input-wrapper-class=\"d-recipe-editor-link__input-wrapper\"\n @click=\"onInputFocus\"\n @focus=\"onInputFocus\"\n @click.native.stop=\"onInputFocus\"\n @keydown.enter=\"setLink\"\n />\n </div>\n </template>\n <template #footerContent>\n <dt-stack\n direction=\"row\"\n gap=\"300\"\n class=\"d-recipe-editor__popover-footer\"\n >\n <dt-button\n :aria-label=\"removeLinkButton.ariaLabel\"\n data-qa=\"dt-recipe-editor-remove-link-btn\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"sm\"\n @click=\"removeLink\"\n >\n {{ removeLinkButton.label }}\n </dt-button>\n <dt-button\n :aria-label=\"cancelSetLinkButton.ariaLabel\"\n data-qa=\"dt-recipe-editor-set-link-cancel-btn\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"sm\"\n @click=\"closeLinkInput\"\n >\n {{ cancelSetLinkButton.label }}\n </dt-button>\n <dt-button\n :aria-label=\"confirmSetLinkButton.ariaLabel\"\n data-qa=\"dt-recipe-editor-set-link-confirm-btn\"\n size=\"sm\"\n @click=\"setLink\"\n >\n {{ confirmSetLinkButton.label }}\n </dt-button>\n </dt-stack>\n </template>\n </dt-popover>\n </dt-stack>\n </dt-stack>\n\n <!-- Some wrapper to restrict the height and show the scrollbar -->\n <div\n :style=\"{ 'max-height': maxHeight }\"\n class=\"d-recipe-editor__content\"\n >\n <dt-rich-text-editor\n ref=\"richTextEditor\"\n v-model=\"internalInputValue\"\n :allow-inline-images=\"true\"\n :allow-line-breaks=\"true\"\n :hide-link-bubble-menu=\"true\"\n :auto-focus=\"autoFocus\"\n :editable=\"editable\"\n :input-aria-label=\"inputAriaLabel\"\n :input-class=\"`d-recipe-editor__content-input ${inputClass}`\"\n :link=\"true\"\n :output-format=\"htmlOutputFormat\"\n :placeholder=\"placeholder\"\n :use-div-tags=\"useDivTags\"\n data-qa=\"dt-rich-text-editor\"\n v-bind=\"$attrs\"\n @text-input=\"onTextInput\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @input=\"onInput($event)\"\n />\n </div>\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 {\n EDITOR_SUPPORTED_LINK_PROTOCOLS,\n EDITOR_DEFAULT_LINK_PREFIX,\n} from './editor_constants.js';\nimport { DtButton } from '@/components/button';\nimport { DtPopover } from '@/components/popover';\nimport { DtStack } from '@/components/stack';\nimport { DtInput } from '@/components/input';\nimport { DtTooltip } from '@/components/tooltip';\nimport {\n DtIconAlignCenter,\n DtIconAlignJustify,\n DtIconAlignLeft,\n DtIconAlignRight,\n DtIconBold,\n DtIconCodeBlock,\n DtIconImage,\n DtIconItalic,\n DtIconQuickReply,\n DtIconLink2,\n DtIconListBullet,\n DtIconListOrdered,\n DtIconQuote,\n DtIconStrikethrough,\n DtIconUnderline,\n} from '@dialpad/dialtone-icons/vue2';\nimport { ref } from 'vue';\n\nexport default {\n name: 'DtRecipeEditor',\n\n components: {\n DtRichTextEditor,\n DtButton,\n DtPopover,\n DtStack,\n DtInput,\n DtTooltip,\n DtIconQuickReply,\n DtIconBold,\n DtIconItalic,\n DtIconUnderline,\n DtIconStrikethrough,\n DtIconListBullet,\n DtIconListOrdered,\n DtIconAlignLeft,\n DtIconAlignCenter,\n DtIconAlignRight,\n DtIconAlignJustify,\n DtIconQuote,\n DtIconCodeBlock,\n DtIconLink2,\n DtIconImage,\n },\n\n inheritAttrs: false,\n\n props: {\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 value: {\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 * 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 * Placeholder text\n */\n placeholder: {\n type: String,\n default: '',\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 /**\n * Confirm set link button defaults.\n */\n confirmSetLinkButton: {\n type: Object,\n default: () => ({ label: 'Confirm', ariaLabel: 'Confirm set link' }),\n },\n\n /**\n * Remove link button defaults.\n */\n removeLinkButton: {\n type: Object,\n default: () => ({ label: 'Remove', ariaLabel: 'Remove link' }),\n },\n\n /**\n * Cancel set link button defaults.\n */\n cancelSetLinkButton: {\n type: Object,\n default: () => ({ label: 'Cancel', ariaLabel: 'Cancel set link' }),\n },\n\n /**\n * Placeholder text for the set link input field\n */\n setLinkPlaceholder: {\n type: String,\n default: '',\n },\n\n /**\n * Show button to render text as bold\n */\n showBoldButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to render text in italics\n */\n showItalicsButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to underline text\n */\n showUnderlineButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to strike text\n */\n showStrikeButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to render list items\n */\n showListItemsButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to render ordered list items\n */\n showOrderedListButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to align text to the left\n */\n showAlignLeftButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to align text to the center\n */\n showAlignCenterButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to align text to the right\n */\n showAlignRightButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to justify text\n */\n showAlignJustifyButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to add quote format to text\n */\n showQuoteButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to add code block\n */\n showCodeBlockButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to handle quick replies\n */\n showQuickRepliesButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to add an inline image\n */\n showInlineImageButton: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Show add link default config.\n */\n showAddLink: {\n type: Object,\n default: () => ({\n showAddLinkButton: true,\n setLinkTitle: 'Add a link',\n setLinkInputAriaLabel: 'Input field to add link',\n }),\n },\n\n /**\n * Use div tags instead of paragraph tags to show text\n */\n useDivTags: {\n type: Boolean,\n default: false,\n },\n },\n\n emits: [\n /**\n * Native focus event\n * @event input\n * @type {String|JSON}\n */\n 'focus',\n\n /**\n * Native blur event\n * @event input\n * @type {String|JSON}\n */\n 'blur',\n\n /**\n * Native input event\n * @event input\n * @type {String|JSON}\n */\n 'input',\n\n /**\n * Quick replies button\n * pressed event\n * @event quick-replies-click\n */\n 'quick-replies-click',\n\n /**\n * Emit when inline image button is clicked\n * @event inline-image-click\n */\n 'inline-image-click',\n\n /**\n * Emit when text content changes (not raw html)\n */\n 'text-input',\n ],\n\n data () {\n return {\n internalInputValue: this.value, // internal input content\n hasFocus: false,\n\n linkOptions: {\n class: 'd-recipe-editor__link',\n },\n\n showLinkInput: false,\n linkInput: '',\n currentButtonRefIndex: 0,\n buttonRefMap: ref({}),\n };\n },\n\n computed: {\n inputLength () {\n return this.internalInputValue.length;\n },\n\n htmlOutputFormat () {\n return RICH_TEXT_EDITOR_OUTPUT_FORMATS[2];\n },\n\n showingTextFormatButtons () {\n return this.showBoldButton || this.showItalicsButton || this.showStrikeButton || this.showUnderlineButton;\n },\n\n showingAlignmentButtons () {\n return this.showAlignLeftButton || this.showAlignCenterButton ||\n this.showAlignRightButton || this.showAlignJustifyButton;\n },\n\n showingListButtons () {\n return this.showListItemsButton || this.showOrderedListButton;\n },\n\n orderedRefs () {\n const refs = this.buttonGroups.reduce(function (acc, buttonData) {\n buttonData.buttonGroup.forEach(button => {\n acc.push(this.getButtonRef(buttonData.key, button.selector));\n }, this);\n return acc;\n }.bind(this), []);\n refs.push(this.getButtonRef('custom', 'link'));\n return refs;\n },\n\n buttonGroups () {\n const individualButtonStacks = this.individualButtons.map(buttonData => ({\n key: buttonData.selector,\n buttonGroup: [buttonData],\n }));\n return [\n { key: 'new', buttonGroup: this.newButtons },\n { key: 'format', buttonGroup: this.textFormatButtons },\n { key: 'alignment', buttonGroup: this.alignmentButtons },\n { key: 'list', buttonGroup: this.listButtons },\n ...individualButtonStacks,\n ].filter(buttonGroupData => buttonGroupData.buttonGroup.length > 0);\n },\n\n newButtons () {\n return [\n {\n showBtn: this.showQuickRepliesButton,\n label: 'Quick reply',\n selector: 'quickReplies',\n icon: DtIconQuickReply,\n dataQA: 'dt-recipe-editor-quick-replies-btn',\n tooltipMessage: 'Quick Reply',\n onClick: this.onQuickRepliesClick,\n },\n ].filter(button => button.showBtn);\n },\n\n textFormatButtons () {\n return [\n {\n showBtn: this.showBoldButton,\n selector: 'bold',\n icon: DtIconBold,\n dataQA: 'dt-recipe-editor-bold-btn',\n tooltipMessage: 'Bold',\n onClick: this.onBoldTextToggle,\n },\n {\n showBtn: this.showItalicsButton,\n selector: 'italic',\n icon: DtIconItalic,\n dataQA: 'dt-recipe-editor-italics-btn',\n tooltipMessage: 'Italics',\n onClick: this.onItalicTextToggle,\n },\n {\n showBtn: this.showUnderlineButton,\n selector: 'underline',\n icon: DtIconUnderline,\n dataQA: 'dt-recipe-editor-underline-btn',\n tooltipMessage: 'Underline',\n onClick: this.onUnderlineTextToggle,\n },\n {\n showBtn: this.showStrikeButton,\n selector: 'strike',\n icon: DtIconStrikethrough,\n dataQA: 'dt-recipe-editor-strike-btn',\n tooltipMessage: 'Strike',\n onClick: this.onStrikethroughTextToggle,\n },\n ].filter(button => button.showBtn);\n },\n\n alignmentButtons () {\n return [\n {\n showBtn: this.showAlignLeftButton,\n selector: { textAlign: 'left' },\n icon: DtIconAlignLeft,\n dataQA: 'dt-recipe-editor-align-left-btn',\n tooltipMessage: 'Align Left',\n onClick: () => this.onTextAlign('left'),\n },\n {\n showBtn: this.showAlignCenterButton,\n selector: { textAlign: 'center' },\n icon: DtIconAlignCenter,\n dataQA: 'dt-recipe-editor-align-center-btn',\n tooltipMessage: 'Align Center',\n onClick: () => this.onTextAlign('center'),\n },\n {\n showBtn: this.showAlignRightButton,\n selector: { textAlign: 'right' },\n icon: DtIconAlignRight,\n dataQA: 'dt-recipe-editor-align-right-btn',\n tooltipMessage: 'Align Right',\n onClick: () => this.onTextAlign('right'),\n },\n {\n showBtn: this.showAlignJustifyButton,\n selector: { textAlign: 'justify' },\n icon: DtIconAlignJustify,\n dataQA: 'dt-recipe-editor-align-justify-btn',\n tooltipMessage: 'Align Justify',\n onClick: () => this.onTextAlign('justify'),\n },\n ].filter(button => button.showBtn);\n },\n\n listButtons () {\n return [\n {\n showBtn: this.showListItemsButton,\n selector: 'bulletList',\n icon: DtIconListBullet,\n dataQA: 'dt-recipe-editor-list-items-btn',\n tooltipMessage: 'Bullet List',\n onClick: this.onBulletListToggle,\n },\n {\n showBtn: this.showOrderedListButton,\n selector: 'orderedList',\n icon: DtIconListOrdered,\n dataQA: 'dt-recipe-editor-ordered-list-items-btn',\n tooltipMessage: 'Ordered List',\n onClick: this.onOrderedListToggle,\n },\n ].filter(button => button.showBtn);\n },\n\n individualButtons () {\n return [\n {\n showBtn: this.showQuoteButton,\n selector: 'blockquote',\n icon: DtIconQuote,\n dataQA: 'dt-recipe-editor-blockquote-btn',\n tooltipMessage: 'Quote',\n onClick: this.onBlockquoteToggle,\n },\n {\n showBtn: this.showCodeBlockButton,\n selector: 'codeBlock',\n icon: DtIconCodeBlock,\n dataQA: 'dt-recipe-editor-code-block-btn',\n tooltipMessage: 'Code',\n onClick: this.onCodeBlockToggle,\n },\n {\n showBtn: this.showInlineImageButton,\n selector: 'image',\n icon: DtIconImage,\n dataQA: 'dt-recipe-editor-inline-image-btn',\n tooltipMessage: 'Image',\n onClick: this.onInsertInlineImageClick,\n },\n ].filter(button => button.showBtn);\n },\n\n linkButton () {\n return {\n showBtn: this.showAddLink.showAddLinkButton,\n selector: 'link',\n icon: DtIconLink2,\n dataQA: 'dt-recipe-editor-add-link-btn',\n tooltipMessage: 'Link',\n onClick: this.openLinkInput,\n };\n },\n\n },\n\n watch: {\n value (newValue) {\n this.internalInputValue = newValue;\n },\n },\n\n methods: {\n onInputFocus (event) {\n event?.stopPropagation();\n },\n\n removeLink () {\n this.$refs.richTextEditor?.editor?.chain()?.focus()?.unsetLink()?.run();\n this.closeLinkInput();\n },\n\n setLink (event) {\n const editor = this.$refs.richTextEditor?.editor;\n event?.preventDefault();\n event?.stopPropagation();\n\n if (!this.linkInput) {\n // If link text is set to empty string,\n // remove any existing links.\n this.removeLink();\n return;\n }\n\n // Check if input matches any of the supported link formats\n const prefix = EDITOR_SUPPORTED_LINK_PROTOCOLS.find(prefixRegex => prefixRegex.test(this.linkInput));\n\n if (!prefix) {\n // If no matching pattern is found, prepend default prefix\n this.linkInput = `${EDITOR_DEFAULT_LINK_PREFIX}${this.linkInput}`;\n }\n\n const selection = editor?.view?.state?.selection;\n\n if (selection.anchor === selection.head) {\n // If no text has been selected, manually insert the link text.\n // Do not rely on link options set through DtRichTextEditor\n // component, because they clash with these and cause issues.\n editor\n .chain()\n .focus()\n .insertContentAt(\n selection.anchor,\n `<a class=\"${this.linkOptions.class}\" href=${this.linkInput}>${this.linkInput}</a>`,\n )\n .run();\n } else {\n // Set or edit the link\n editor\n .chain()\n .focus()\n .extendMarkRange('link')\n .setLink({ href: this.linkInput, class: this.linkOptions.class })\n .run();\n }\n\n this.closeLinkInput();\n },\n\n openLinkInput () {\n this.showLinkInput = true;\n },\n\n updateInput (openedInput) {\n if (!openedInput) {\n return this.closeLinkInput();\n }\n this.linkInput = this.$refs.richTextEditor?.editor?.getAttributes('link')?.href;\n },\n\n closeLinkInput () {\n this.showLinkInput = false;\n this.linkInput = '';\n this.$refs.richTextEditor.editor?.chain().focus();\n },\n\n onBoldTextToggle () {\n this.$refs.richTextEditor?.editor?.chain().focus().toggleBold().run();\n },\n\n onItalicTextToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleItalic().run();\n },\n\n onUnderlineTextToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleUnderline().run();\n },\n\n onStrikethroughTextToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleStrike().run();\n },\n\n onTextAlign (alignment) {\n if (this.$refs.richTextEditor?.editor?.isActive({ textAlign: alignment })) {\n // If this alignment type is already set here, unset it\n return this.$refs.richTextEditor?.editor.chain().focus().unsetTextAlign().run();\n }\n this.$refs.richTextEditor?.editor.chain().focus().setTextAlign(alignment).run();\n },\n\n onBulletListToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleBulletList().run();\n },\n\n onOrderedListToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleOrderedList().run();\n },\n\n onCodeBlockToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleCodeBlock().run();\n },\n\n onQuickRepliesClick () {\n this.$emit('quick-replies-click');\n },\n\n onInsertInlineImageClick () {\n this.$emit('inline-image-click');\n },\n\n insertInlineImage (imageUrl) {\n this.$refs.richTextEditor?.editor.chain().focus().setImage({ src: imageUrl }).run();\n },\n\n onBlockquoteToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleBlockquote().run();\n },\n\n insertInMessageBody (messageContent) {\n this.$refs.richTextEditor?.editor.chain().focus().insertContent(messageContent).run();\n },\n\n setCursorPosition (position = null) {\n this.$refs.richTextEditor?.editor.chain().focus(position).run();\n },\n\n onTextInput (event) {\n this.$emit('text-input', event);\n },\n\n onFocus (event) {\n this.hasFocus = true;\n this.$emit('focus', event);\n },\n\n onBlur (event) {\n this.hasFocus = false;\n this.$emit('blur', event);\n },\n\n onInput (event) {\n this.$emit('input', event);\n },\n\n getButtonKey (key, selector) {\n return `${key}-${JSON.stringify(selector)}`;\n },\n\n // Unique Button Ref Key to identify ref\n getButtonRef (key, selector) {\n return `${this.getButtonKey(key, selector)}-ref`;\n },\n\n /**\n * Determines if an element in the action bar button list is focusable with tab key\n * @param {string} refKey - unique identifier for the ref element in DOM\n */\n canFocus (refKey) {\n return refKey === this.orderedRefs[this.currentButtonRefIndex];\n },\n\n shiftActionBarFocusRight () {\n this.shiftButtonRefIndex(1);\n },\n\n shiftActionBarFocusLeft () {\n this.shiftButtonRefIndex(-1);\n },\n\n shiftButtonRefIndex (shiftAmount) {\n const previousRef = this.buttonRefMap[this.orderedRefs[this.currentButtonRefIndex]];\n const index = (this.currentButtonRefIndex + shiftAmount) % this.orderedRefs.length;\n this.currentButtonRefIndex = index >= 0 ? index : this.orderedRefs.length + index;\n const currentRef = this.buttonRefMap[this.orderedRefs[this.currentButtonRefIndex]];\n previousRef.$el.blur();\n currentRef.$el.focus();\n },\n },\n};\n</script>\n"],"names":["_sfc_main","DtRichTextEditor","DtButton","DtPopover","DtStack","DtInput","DtTooltip","DtIconQuickReply","DtIconBold","DtIconItalic","DtIconUnderline","DtIconStrikethrough","DtIconListBullet","DtIconListOrdered","DtIconAlignLeft","DtIconAlignCenter","DtIconAlignRight","DtIconAlignJustify","DtIconQuote","DtIconCodeBlock","DtIconLink2","DtIconImage","autoFocus","RICH_TEXT_EDITOR_AUTOFOCUS_TYPES","ref","RICH_TEXT_EDITOR_OUTPUT_FORMATS","refs","acc","buttonData","button","individualButtonStacks","buttonGroupData","newValue","event","_e","_d","_c","_b","_a","editor","EDITOR_SUPPORTED_LINK_PROTOCOLS","prefixRegex","EDITOR_DEFAULT_LINK_PREFIX","selection","openedInput","alignment","imageUrl","messageContent","position","key","selector","refKey","shiftAmount","previousRef","index","currentRef"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EDITOR_SUPPORTED_LINK_PROTOCOLS as L, EDITOR_DEFAULT_LINK_PREFIX as x } from "./editor-constants.js";
|
|
2
|
-
import {
|
|
2
|
+
import { DtIconQuickReply as u, DtIconBold as a, DtIconItalic as c, DtIconUnderline as d, DtIconStrikethrough as h, DtIconListBullet as p, DtIconListOrdered as f, DtIconAlignLeft as k, DtIconAlignCenter as g, DtIconAlignRight as B, DtIconAlignJustify as m, DtIconQuote as I, DtIconCodeBlock as y, DtIconLink2 as w, DtIconImage as b } from "@dialpad/dialtone-icons/vue2";
|
|
3
3
|
import { ref as A } from "vue";
|
|
4
4
|
import { n as T } from "../../_plugin-vue2_normalizer-DSLOjnn3.js";
|
|
5
5
|
import _ from "../rich-text-editor/rich-text-editor.js";
|
|
@@ -9,7 +9,7 @@ import O from "../stack/stack.js";
|
|
|
9
9
|
import E from "../input/input.js";
|
|
10
10
|
import S from "../tooltip/tooltip.js";
|
|
11
11
|
import { RICH_TEXT_EDITOR_AUTOFOCUS_TYPES as F, RICH_TEXT_EDITOR_OUTPUT_FORMATS as D } from "../rich-text-editor/rich-text-editor-constants.js";
|
|
12
|
-
const
|
|
12
|
+
const Q = {
|
|
13
13
|
name: "DtRecipeEditor",
|
|
14
14
|
components: {
|
|
15
15
|
DtRichTextEditor: _,
|
|
@@ -18,7 +18,7 @@ const M = {
|
|
|
18
18
|
DtStack: O,
|
|
19
19
|
DtInput: E,
|
|
20
20
|
DtTooltip: S,
|
|
21
|
-
|
|
21
|
+
DtIconQuickReply: u,
|
|
22
22
|
DtIconBold: a,
|
|
23
23
|
DtIconItalic: c,
|
|
24
24
|
DtIconUnderline: d,
|
|
@@ -312,9 +312,9 @@ const M = {
|
|
|
312
312
|
return this.showListItemsButton || this.showOrderedListButton;
|
|
313
313
|
},
|
|
314
314
|
orderedRefs() {
|
|
315
|
-
const e = this.buttonGroups.reduce((function(t,
|
|
316
|
-
return
|
|
317
|
-
t.push(this.getButtonRef(
|
|
315
|
+
const e = this.buttonGroups.reduce((function(t, n) {
|
|
316
|
+
return n.buttonGroup.forEach((i) => {
|
|
317
|
+
t.push(this.getButtonRef(n.key, i.selector));
|
|
318
318
|
}, this), t;
|
|
319
319
|
}).bind(this), []);
|
|
320
320
|
return e.push(this.getButtonRef("custom", "link")), e;
|
|
@@ -486,8 +486,8 @@ const M = {
|
|
|
486
486
|
e == null || e.stopPropagation();
|
|
487
487
|
},
|
|
488
488
|
removeLink() {
|
|
489
|
-
var e, t,
|
|
490
|
-
(o = (
|
|
489
|
+
var e, t, n, i, o;
|
|
490
|
+
(o = (i = (n = (t = (e = this.$refs.richTextEditor) == null ? void 0 : e.editor) == null ? void 0 : t.chain()) == null ? void 0 : n.focus()) == null ? void 0 : i.unsetLink()) == null || o.run(), this.closeLinkInput();
|
|
491
491
|
},
|
|
492
492
|
setLink(e) {
|
|
493
493
|
var o, r, l;
|
|
@@ -497,9 +497,9 @@ const M = {
|
|
|
497
497
|
return;
|
|
498
498
|
}
|
|
499
499
|
L.find((s) => s.test(this.linkInput)) || (this.linkInput = `${x}${this.linkInput}`);
|
|
500
|
-
const
|
|
501
|
-
|
|
502
|
-
|
|
500
|
+
const i = (l = (r = t == null ? void 0 : t.view) == null ? void 0 : r.state) == null ? void 0 : l.selection;
|
|
501
|
+
i.anchor === i.head ? t.chain().focus().insertContentAt(
|
|
502
|
+
i.anchor,
|
|
503
503
|
`<a class="${this.linkOptions.class}" href=${this.linkInput}>${this.linkInput}</a>`
|
|
504
504
|
).run() : t.chain().focus().extendMarkRange("link").setLink({ href: this.linkInput, class: this.linkOptions.class }).run(), this.closeLinkInput();
|
|
505
505
|
},
|
|
@@ -507,10 +507,10 @@ const M = {
|
|
|
507
507
|
this.showLinkInput = !0;
|
|
508
508
|
},
|
|
509
509
|
updateInput(e) {
|
|
510
|
-
var t,
|
|
510
|
+
var t, n, i;
|
|
511
511
|
if (!e)
|
|
512
512
|
return this.closeLinkInput();
|
|
513
|
-
this.linkInput = (
|
|
513
|
+
this.linkInput = (i = (n = (t = this.$refs.richTextEditor) == null ? void 0 : t.editor) == null ? void 0 : n.getAttributes("link")) == null ? void 0 : i.href;
|
|
514
514
|
},
|
|
515
515
|
closeLinkInput() {
|
|
516
516
|
var e;
|
|
@@ -533,9 +533,9 @@ const M = {
|
|
|
533
533
|
(e = this.$refs.richTextEditor) == null || e.editor.chain().focus().toggleStrike().run();
|
|
534
534
|
},
|
|
535
535
|
onTextAlign(e) {
|
|
536
|
-
var t,
|
|
537
|
-
if ((
|
|
538
|
-
return (
|
|
536
|
+
var t, n, i, o;
|
|
537
|
+
if ((n = (t = this.$refs.richTextEditor) == null ? void 0 : t.editor) != null && n.isActive({ textAlign: e }))
|
|
538
|
+
return (i = this.$refs.richTextEditor) == null ? void 0 : i.editor.chain().focus().unsetTextAlign().run();
|
|
539
539
|
(o = this.$refs.richTextEditor) == null || o.editor.chain().focus().setTextAlign(e).run();
|
|
540
540
|
},
|
|
541
541
|
onBulletListToggle() {
|
|
@@ -605,71 +605,71 @@ const M = {
|
|
|
605
605
|
this.shiftButtonRefIndex(-1);
|
|
606
606
|
},
|
|
607
607
|
shiftButtonRefIndex(e) {
|
|
608
|
-
const t = this.buttonRefMap[this.orderedRefs[this.currentButtonRefIndex]],
|
|
609
|
-
this.currentButtonRefIndex =
|
|
610
|
-
const
|
|
611
|
-
t.$el.blur(),
|
|
608
|
+
const t = this.buttonRefMap[this.orderedRefs[this.currentButtonRefIndex]], n = (this.currentButtonRefIndex + e) % this.orderedRefs.length;
|
|
609
|
+
this.currentButtonRefIndex = n >= 0 ? n : this.orderedRefs.length + n;
|
|
610
|
+
const i = this.buttonRefMap[this.orderedRefs[this.currentButtonRefIndex]];
|
|
611
|
+
t.$el.blur(), i.$el.focus();
|
|
612
612
|
}
|
|
613
613
|
}
|
|
614
614
|
};
|
|
615
|
-
var
|
|
616
|
-
var t = this,
|
|
617
|
-
return
|
|
615
|
+
var M = function() {
|
|
616
|
+
var t = this, n = t._self._c;
|
|
617
|
+
return n("div", { staticClass: "d-recipe-editor", attrs: { "data-qa": "dt-recipe-editor", role: "presentation" }, on: { click: function(i) {
|
|
618
618
|
return t.$refs.richTextEditor.focusEditor();
|
|
619
|
-
} } }, [
|
|
620
|
-
return
|
|
621
|
-
return
|
|
619
|
+
} } }, [n("dt-stack", { staticClass: "d-recipe-editor__top-bar", attrs: { direction: "row", gap: "450" } }, [t._l(t.buttonGroups, function(i) {
|
|
620
|
+
return n("dt-stack", { key: i.key, attrs: { direction: "row", gap: "300" } }, [t._l(i.buttonGroup, function(o) {
|
|
621
|
+
return n("dt-tooltip", { key: t.getButtonKey(i.key, o.selector), attrs: { message: o.tooltipMessage, placement: "top" }, scopedSlots: t._u([{ key: "anchor", fn: function() {
|
|
622
622
|
var r, l;
|
|
623
|
-
return [
|
|
624
|
-
t.buttonRefMap[t.getButtonRef(
|
|
625
|
-
}, refInFor: !0, attrs: { active: (l = (r = t.$refs.richTextEditor) == null ? void 0 : r.editor) == null ? void 0 : l.isActive(o.selector), "aria-label": o.tooltipMessage, "data-qa": o.dataQA, tabindex: t.canFocus(t.getButtonRef(
|
|
623
|
+
return [n("dt-button", { ref: (s) => {
|
|
624
|
+
t.buttonRefMap[t.getButtonRef(i.key, o.selector)] = s;
|
|
625
|
+
}, refInFor: !0, attrs: { active: (l = (r = t.$refs.richTextEditor) == null ? void 0 : r.editor) == null ? void 0 : l.isActive(o.selector), "aria-label": o.tooltipMessage, "data-qa": o.dataQA, tabindex: t.canFocus(t.getButtonRef(i.key, o.selector)) ? 0 : -1, importance: "clear", kind: "muted", size: "xs" }, on: { click: function(s) {
|
|
626
626
|
return o.onClick();
|
|
627
627
|
}, keydown: [function(s) {
|
|
628
628
|
return !s.type.indexOf("key") && t._k(s.keyCode, "right", 39, s.key, ["Right", "ArrowRight"]) || "button" in s && s.button !== 2 ? null : (s.stopPropagation(), t.shiftActionBarFocusRight.apply(null, arguments));
|
|
629
629
|
}, function(s) {
|
|
630
630
|
return !s.type.indexOf("key") && t._k(s.keyCode, "left", 37, s.key, ["Left", "ArrowLeft"]) || "button" in s && s.button !== 0 ? null : (s.stopPropagation(), t.shiftActionBarFocusLeft.apply(null, arguments));
|
|
631
631
|
}] }, scopedSlots: t._u([{ key: "icon", fn: function() {
|
|
632
|
-
return [
|
|
633
|
-
}, proxy: !0 }], null, !0) }, [o.label ?
|
|
632
|
+
return [n(o.icon, { tag: "component", attrs: { size: "200" } })];
|
|
633
|
+
}, proxy: !0 }], null, !0) }, [o.label ? n("span", [t._v(t._s(o.label))]) : t._e()])];
|
|
634
634
|
}, proxy: !0 }], null, !0) });
|
|
635
|
-
}),
|
|
636
|
-
}), t.linkButton.showBtn ?
|
|
637
|
-
t.showLinkInput =
|
|
638
|
-
}, click: t.onInputFocus, opened: t.updateInput }, nativeOn: { click: function(
|
|
639
|
-
return
|
|
635
|
+
}), n("div", { staticClass: "d-recipe-editor__button-group-divider" })], 2);
|
|
636
|
+
}), t.linkButton.showBtn ? n("dt-stack", { attrs: { direction: "row", gap: "300" } }, [n("dt-popover", { attrs: { open: t.showLinkInput, "show-close-button": !1, "visually-hidden-close": !0, "visually-hidden-close-label": "Close link input popover", "data-qa": "dt-recipe-editor-link-input-popover", padding: "none", placement: "bottom-start" }, on: { "update:open": function(i) {
|
|
637
|
+
t.showLinkInput = i;
|
|
638
|
+
}, click: t.onInputFocus, opened: t.updateInput }, nativeOn: { click: function(i) {
|
|
639
|
+
return i.stopPropagation(), t.onInputFocus.apply(null, arguments);
|
|
640
640
|
} }, scopedSlots: t._u([{ key: "anchor", fn: function() {
|
|
641
|
-
return [
|
|
642
|
-
var
|
|
643
|
-
return [
|
|
641
|
+
return [n("dt-tooltip", { key: t.linkButton.key, attrs: { message: t.linkButton.tooltipMessage, placement: "top" }, scopedSlots: t._u([{ key: "anchor", fn: function() {
|
|
642
|
+
var i, o;
|
|
643
|
+
return [n("dt-button", { ref: (r) => {
|
|
644
644
|
t.buttonRefMap[t.getButtonRef("custom", "link")] = r;
|
|
645
|
-
}, attrs: { active: (o = (
|
|
645
|
+
}, attrs: { active: (o = (i = t.$refs.richTextEditor) == null ? void 0 : i.editor) == null ? void 0 : o.isActive(t.linkButton.selector), "aria-label": t.linkButton.tooltipMessage, "data-qa": t.linkButton.dataQA, tabindex: t.canFocus(t.getButtonRef("custom", "link")) ? 0 : -1, importance: "clear", kind: "muted", size: "xs" }, on: { click: function(r) {
|
|
646
646
|
return t.linkButton.onClick();
|
|
647
647
|
}, keydown: [function(r) {
|
|
648
648
|
return !r.type.indexOf("key") && t._k(r.keyCode, "right", 39, r.key, ["Right", "ArrowRight"]) || "button" in r && r.button !== 2 ? null : (r.stopPropagation(), t.shiftActionBarFocusRight.apply(null, arguments));
|
|
649
649
|
}, function(r) {
|
|
650
650
|
return !r.type.indexOf("key") && t._k(r.keyCode, "left", 37, r.key, ["Left", "ArrowLeft"]) || "button" in r && r.button !== 0 ? null : (r.stopPropagation(), t.shiftActionBarFocusLeft.apply(null, arguments));
|
|
651
651
|
}] }, scopedSlots: t._u([{ key: "icon", fn: function() {
|
|
652
|
-
return [
|
|
652
|
+
return [n(t.linkButton.icon, { tag: "component", attrs: { size: "200" } })];
|
|
653
653
|
}, proxy: !0 }], null, !1, 3601441856) })];
|
|
654
654
|
}, proxy: !0 }], null, !1, 1796000448) })];
|
|
655
655
|
}, proxy: !0 }, { key: "content", fn: function() {
|
|
656
|
-
return [
|
|
657
|
-
return !
|
|
658
|
-
} }, nativeOn: { click: function(
|
|
659
|
-
return
|
|
660
|
-
} }, model: { value: t.linkInput, callback: function(
|
|
661
|
-
t.linkInput =
|
|
656
|
+
return [n("div", { staticClass: "d-recipe-editor__popover-content" }, [t.showAddLink.setLinkTitle.length > 0 ? n("span", [t._v(" " + t._s(t.showAddLink.setLinkTitle) + " ")]) : t._e(), n("dt-input", { attrs: { "input-aria-label": t.showAddLink.setLinkInputAriaLabel, placeholder: t.setLinkPlaceholder, "data-qa": "dt-recipe-editor-link-input", "input-wrapper-class": "d-recipe-editor-link__input-wrapper" }, on: { click: t.onInputFocus, focus: t.onInputFocus, keydown: function(i) {
|
|
657
|
+
return !i.type.indexOf("key") && t._k(i.keyCode, "enter", 13, i.key, "Enter") ? null : t.setLink.apply(null, arguments);
|
|
658
|
+
} }, nativeOn: { click: function(i) {
|
|
659
|
+
return i.stopPropagation(), t.onInputFocus.apply(null, arguments);
|
|
660
|
+
} }, model: { value: t.linkInput, callback: function(i) {
|
|
661
|
+
t.linkInput = i;
|
|
662
662
|
}, expression: "linkInput" } })], 1)];
|
|
663
663
|
}, proxy: !0 }, { key: "footerContent", fn: function() {
|
|
664
|
-
return [
|
|
665
|
-
}, proxy: !0 }], null, !1, 484310841) })], 1) : t._e()], 2),
|
|
666
|
-
return t.onInput(
|
|
667
|
-
} }, model: { value: t.internalInputValue, callback: function(
|
|
668
|
-
t.internalInputValue =
|
|
664
|
+
return [n("dt-stack", { staticClass: "d-recipe-editor__popover-footer", attrs: { direction: "row", gap: "300" } }, [n("dt-button", { attrs: { "aria-label": t.removeLinkButton.ariaLabel, "data-qa": "dt-recipe-editor-remove-link-btn", importance: "clear", kind: "muted", size: "sm" }, on: { click: t.removeLink } }, [t._v(" " + t._s(t.removeLinkButton.label) + " ")]), n("dt-button", { attrs: { "aria-label": t.cancelSetLinkButton.ariaLabel, "data-qa": "dt-recipe-editor-set-link-cancel-btn", importance: "clear", kind: "muted", size: "sm" }, on: { click: t.closeLinkInput } }, [t._v(" " + t._s(t.cancelSetLinkButton.label) + " ")]), n("dt-button", { attrs: { "aria-label": t.confirmSetLinkButton.ariaLabel, "data-qa": "dt-recipe-editor-set-link-confirm-btn", size: "sm" }, on: { click: t.setLink } }, [t._v(" " + t._s(t.confirmSetLinkButton.label) + " ")])], 1)];
|
|
665
|
+
}, proxy: !0 }], null, !1, 484310841) })], 1) : t._e()], 2), n("div", { staticClass: "d-recipe-editor__content", style: { "max-height": t.maxHeight } }, [n("dt-rich-text-editor", t._b({ ref: "richTextEditor", attrs: { "allow-inline-images": !0, "allow-line-breaks": !0, "hide-link-bubble-menu": !0, "auto-focus": t.autoFocus, editable: t.editable, "input-aria-label": t.inputAriaLabel, "input-class": `d-recipe-editor__content-input ${t.inputClass}`, link: !0, "output-format": t.htmlOutputFormat, placeholder: t.placeholder, "use-div-tags": t.useDivTags, "data-qa": "dt-rich-text-editor" }, on: { "text-input": t.onTextInput, blur: t.onBlur, focus: t.onFocus, input: function(i) {
|
|
666
|
+
return t.onInput(i);
|
|
667
|
+
} }, model: { value: t.internalInputValue, callback: function(i) {
|
|
668
|
+
t.internalInputValue = i;
|
|
669
669
|
}, expression: "internalInputValue" } }, "dt-rich-text-editor", t.$attrs, !1))], 1)], 1);
|
|
670
670
|
}, v = [], $ = /* @__PURE__ */ T(
|
|
671
|
-
M,
|
|
672
671
|
Q,
|
|
672
|
+
M,
|
|
673
673
|
v
|
|
674
674
|
);
|
|
675
675
|
const X = $.exports;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.js","sources":["../../../recipes/conversation_view/editor/editor.vue"],"sourcesContent":["<template>\n <div\n\n class=\"d-recipe-editor\"\n data-qa=\"dt-recipe-editor\"\n role=\"presentation\"\n @click=\"$refs.richTextEditor.focusEditor()\"\n >\n <!-- Section for the top UI -->\n <dt-stack\n class=\"d-recipe-editor__top-bar\"\n direction=\"row\"\n gap=\"450\"\n >\n <dt-stack\n v-for=\"buttonGroup in buttonGroups\"\n :key=\"buttonGroup.key\"\n direction=\"row\"\n gap=\"300\"\n >\n <dt-tooltip\n v-for=\"button in buttonGroup.buttonGroup\"\n :key=\"getButtonKey(buttonGroup.key, button.selector)\"\n :message=\"button.tooltipMessage\"\n placement=\"top\"\n >\n <template #anchor>\n <dt-button\n :ref=\"(el) => { buttonRefMap[getButtonRef(buttonGroup.key, button.selector)] = el }\"\n :active=\"$refs.richTextEditor?.editor?.isActive(button.selector)\"\n :aria-label=\"button.tooltipMessage\"\n :data-qa=\"button.dataQA\"\n :tabindex=\"canFocus(getButtonRef(buttonGroup.key, button.selector)) ? 0 : -1\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"xs\"\n @click=\"button.onClick()\"\n @keydown.right.stop=\"shiftActionBarFocusRight\"\n @keydown.left.stop=\"shiftActionBarFocusLeft\"\n >\n <template #icon>\n <component\n :is=\"button.icon\"\n size=\"200\"\n />\n </template>\n <span v-if=\"button.label\">{{ button.label }}</span>\n </dt-button>\n </template>\n </dt-tooltip>\n <div class=\"d-recipe-editor__button-group-divider\" />\n </dt-stack>\n <dt-stack\n v-if=\"linkButton.showBtn\"\n direction=\"row\"\n gap=\"300\"\n >\n <dt-popover\n :open.sync=\"showLinkInput\"\n :show-close-button=\"false\"\n :visually-hidden-close=\"true\"\n :visually-hidden-close-label=\"'Close link input popover'\"\n data-qa=\"dt-recipe-editor-link-input-popover\"\n padding=\"none\"\n placement=\"bottom-start\"\n @click=\"onInputFocus\"\n @opened=\"updateInput\"\n @click.native.stop=\"onInputFocus\"\n >\n <template #anchor>\n <dt-tooltip\n :key=\"linkButton.key\"\n :message=\"linkButton.tooltipMessage\"\n placement=\"top\"\n >\n <template #anchor>\n <dt-button\n :ref=\"(el) => { buttonRefMap[getButtonRef('custom', 'link')] = el }\"\n :active=\"$refs.richTextEditor?.editor?.isActive(linkButton.selector)\"\n :aria-label=\"linkButton.tooltipMessage\"\n :data-qa=\"linkButton.dataQA\"\n :tabindex=\"canFocus(getButtonRef('custom', 'link')) ? 0 : -1\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"xs\"\n @click=\"linkButton.onClick()\"\n @keydown.right.stop=\"shiftActionBarFocusRight\"\n @keydown.left.stop=\"shiftActionBarFocusLeft\"\n >\n <template #icon>\n <component\n :is=\"linkButton.icon\"\n size=\"200\"\n />\n </template>\n </dt-button>\n </template>\n </dt-tooltip>\n </template>\n\n <template #content>\n <div class=\"d-recipe-editor__popover-content\">\n <span\n v-if=\"showAddLink.setLinkTitle.length > 0\"\n >\n {{ showAddLink.setLinkTitle }}\n </span>\n <dt-input\n v-model=\"linkInput\"\n :input-aria-label=\"showAddLink.setLinkInputAriaLabel\"\n :placeholder=\"setLinkPlaceholder\"\n data-qa=\"dt-recipe-editor-link-input\"\n input-wrapper-class=\"d-recipe-editor-link__input-wrapper\"\n @click=\"onInputFocus\"\n @focus=\"onInputFocus\"\n @click.native.stop=\"onInputFocus\"\n @keydown.enter=\"setLink\"\n />\n </div>\n </template>\n <template #footerContent>\n <dt-stack\n direction=\"row\"\n gap=\"300\"\n class=\"d-recipe-editor__popover-footer\"\n >\n <dt-button\n :aria-label=\"removeLinkButton.ariaLabel\"\n data-qa=\"dt-recipe-editor-remove-link-btn\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"sm\"\n @click=\"removeLink\"\n >\n {{ removeLinkButton.label }}\n </dt-button>\n <dt-button\n :aria-label=\"cancelSetLinkButton.ariaLabel\"\n data-qa=\"dt-recipe-editor-set-link-cancel-btn\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"sm\"\n @click=\"closeLinkInput\"\n >\n {{ cancelSetLinkButton.label }}\n </dt-button>\n <dt-button\n :aria-label=\"confirmSetLinkButton.ariaLabel\"\n data-qa=\"dt-recipe-editor-set-link-confirm-btn\"\n size=\"sm\"\n @click=\"setLink\"\n >\n {{ confirmSetLinkButton.label }}\n </dt-button>\n </dt-stack>\n </template>\n </dt-popover>\n </dt-stack>\n </dt-stack>\n\n <!-- Some wrapper to restrict the height and show the scrollbar -->\n <div\n :style=\"{ 'max-height': maxHeight }\"\n class=\"d-recipe-editor__content\"\n >\n <dt-rich-text-editor\n ref=\"richTextEditor\"\n v-model=\"internalInputValue\"\n :allow-inline-images=\"true\"\n :allow-line-breaks=\"true\"\n :hide-link-bubble-menu=\"true\"\n :auto-focus=\"autoFocus\"\n :editable=\"editable\"\n :input-aria-label=\"inputAriaLabel\"\n :input-class=\"`d-recipe-editor__content-input ${inputClass}`\"\n :link=\"true\"\n :output-format=\"htmlOutputFormat\"\n :placeholder=\"placeholder\"\n :use-div-tags=\"useDivTags\"\n data-qa=\"dt-rich-text-editor\"\n v-bind=\"$attrs\"\n @text-input=\"onTextInput\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @input=\"onInput($event)\"\n />\n </div>\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 {\n EDITOR_SUPPORTED_LINK_PROTOCOLS,\n EDITOR_DEFAULT_LINK_PREFIX,\n} from './editor_constants.js';\nimport { DtButton } from '@/components/button';\nimport { DtPopover } from '@/components/popover';\nimport { DtStack } from '@/components/stack';\nimport { DtInput } from '@/components/input';\nimport { DtTooltip } from '@/components/tooltip';\nimport {\n DtIconAlignCenter,\n DtIconAlignJustify,\n DtIconAlignLeft,\n DtIconAlignRight,\n DtIconBold,\n DtIconCodeBlock,\n DtIconImage,\n DtIconItalic,\n DtIconLightningBolt,\n DtIconLink2,\n DtIconListBullet,\n DtIconListOrdered,\n DtIconQuote,\n DtIconStrikethrough,\n DtIconUnderline,\n} from '@dialpad/dialtone-icons/vue2';\nimport { ref } from 'vue';\n\nexport default {\n name: 'DtRecipeEditor',\n\n components: {\n DtRichTextEditor,\n DtButton,\n DtPopover,\n DtStack,\n DtInput,\n DtTooltip,\n DtIconLightningBolt,\n DtIconBold,\n DtIconItalic,\n DtIconUnderline,\n DtIconStrikethrough,\n DtIconListBullet,\n DtIconListOrdered,\n DtIconAlignLeft,\n DtIconAlignCenter,\n DtIconAlignRight,\n DtIconAlignJustify,\n DtIconQuote,\n DtIconCodeBlock,\n DtIconLink2,\n DtIconImage,\n },\n\n inheritAttrs: false,\n\n props: {\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 value: {\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 * 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 * Placeholder text\n */\n placeholder: {\n type: String,\n default: '',\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 /**\n * Confirm set link button defaults.\n */\n confirmSetLinkButton: {\n type: Object,\n default: () => ({ label: 'Confirm', ariaLabel: 'Confirm set link' }),\n },\n\n /**\n * Remove link button defaults.\n */\n removeLinkButton: {\n type: Object,\n default: () => ({ label: 'Remove', ariaLabel: 'Remove link' }),\n },\n\n /**\n * Cancel set link button defaults.\n */\n cancelSetLinkButton: {\n type: Object,\n default: () => ({ label: 'Cancel', ariaLabel: 'Cancel set link' }),\n },\n\n /**\n * Placeholder text for the set link input field\n */\n setLinkPlaceholder: {\n type: String,\n default: '',\n },\n\n /**\n * Show button to render text as bold\n */\n showBoldButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to render text in italics\n */\n showItalicsButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to underline text\n */\n showUnderlineButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to strike text\n */\n showStrikeButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to render list items\n */\n showListItemsButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to render ordered list items\n */\n showOrderedListButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to align text to the left\n */\n showAlignLeftButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to align text to the center\n */\n showAlignCenterButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to align text to the right\n */\n showAlignRightButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to justify text\n */\n showAlignJustifyButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to add quote format to text\n */\n showQuoteButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to add code block\n */\n showCodeBlockButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to handle quick replies\n */\n showQuickRepliesButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to add an inline image\n */\n showInlineImageButton: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Show add link default config.\n */\n showAddLink: {\n type: Object,\n default: () => ({\n showAddLinkButton: true,\n setLinkTitle: 'Add a link',\n setLinkInputAriaLabel: 'Input field to add link',\n }),\n },\n\n /**\n * Use div tags instead of paragraph tags to show text\n */\n useDivTags: {\n type: Boolean,\n default: false,\n },\n },\n\n emits: [\n /**\n * Native focus event\n * @event input\n * @type {String|JSON}\n */\n 'focus',\n\n /**\n * Native blur event\n * @event input\n * @type {String|JSON}\n */\n 'blur',\n\n /**\n * Native input event\n * @event input\n * @type {String|JSON}\n */\n 'input',\n\n /**\n * Quick replies button\n * pressed event\n * @event quick-replies-click\n */\n 'quick-replies-click',\n\n /**\n * Emit when inline image button is clicked\n * @event inline-image-click\n */\n 'inline-image-click',\n\n /**\n * Emit when text content changes (not raw html)\n */\n 'text-input',\n ],\n\n data () {\n return {\n internalInputValue: this.value, // internal input content\n hasFocus: false,\n\n linkOptions: {\n class: 'd-recipe-editor__link',\n },\n\n showLinkInput: false,\n linkInput: '',\n currentButtonRefIndex: 0,\n buttonRefMap: ref({}),\n };\n },\n\n computed: {\n inputLength () {\n return this.internalInputValue.length;\n },\n\n htmlOutputFormat () {\n return RICH_TEXT_EDITOR_OUTPUT_FORMATS[2];\n },\n\n showingTextFormatButtons () {\n return this.showBoldButton || this.showItalicsButton || this.showStrikeButton || this.showUnderlineButton;\n },\n\n showingAlignmentButtons () {\n return this.showAlignLeftButton || this.showAlignCenterButton ||\n this.showAlignRightButton || this.showAlignJustifyButton;\n },\n\n showingListButtons () {\n return this.showListItemsButton || this.showOrderedListButton;\n },\n\n orderedRefs () {\n const refs = this.buttonGroups.reduce(function (acc, buttonData) {\n buttonData.buttonGroup.forEach(button => {\n acc.push(this.getButtonRef(buttonData.key, button.selector));\n }, this);\n return acc;\n }.bind(this), []);\n refs.push(this.getButtonRef('custom', 'link'));\n return refs;\n },\n\n buttonGroups () {\n const individualButtonStacks = this.individualButtons.map(buttonData => ({\n key: buttonData.selector,\n buttonGroup: [buttonData],\n }));\n return [\n { key: 'new', buttonGroup: this.newButtons },\n { key: 'format', buttonGroup: this.textFormatButtons },\n { key: 'alignment', buttonGroup: this.alignmentButtons },\n { key: 'list', buttonGroup: this.listButtons },\n ...individualButtonStacks,\n ].filter(buttonGroupData => buttonGroupData.buttonGroup.length > 0);\n },\n\n newButtons () {\n return [\n {\n showBtn: this.showQuickRepliesButton,\n label: 'Quick reply',\n selector: 'quickReplies',\n icon: DtIconLightningBolt,\n dataQA: 'dt-recipe-editor-quick-replies-btn',\n tooltipMessage: 'Quick Reply',\n onClick: this.onQuickRepliesClick,\n },\n ].filter(button => button.showBtn);\n },\n\n textFormatButtons () {\n return [\n {\n showBtn: this.showBoldButton,\n selector: 'bold',\n icon: DtIconBold,\n dataQA: 'dt-recipe-editor-bold-btn',\n tooltipMessage: 'Bold',\n onClick: this.onBoldTextToggle,\n },\n {\n showBtn: this.showItalicsButton,\n selector: 'italic',\n icon: DtIconItalic,\n dataQA: 'dt-recipe-editor-italics-btn',\n tooltipMessage: 'Italics',\n onClick: this.onItalicTextToggle,\n },\n {\n showBtn: this.showUnderlineButton,\n selector: 'underline',\n icon: DtIconUnderline,\n dataQA: 'dt-recipe-editor-underline-btn',\n tooltipMessage: 'Underline',\n onClick: this.onUnderlineTextToggle,\n },\n {\n showBtn: this.showStrikeButton,\n selector: 'strike',\n icon: DtIconStrikethrough,\n dataQA: 'dt-recipe-editor-strike-btn',\n tooltipMessage: 'Strike',\n onClick: this.onStrikethroughTextToggle,\n },\n ].filter(button => button.showBtn);\n },\n\n alignmentButtons () {\n return [\n {\n showBtn: this.showAlignLeftButton,\n selector: { textAlign: 'left' },\n icon: DtIconAlignLeft,\n dataQA: 'dt-recipe-editor-align-left-btn',\n tooltipMessage: 'Align Left',\n onClick: () => this.onTextAlign('left'),\n },\n {\n showBtn: this.showAlignCenterButton,\n selector: { textAlign: 'center' },\n icon: DtIconAlignCenter,\n dataQA: 'dt-recipe-editor-align-center-btn',\n tooltipMessage: 'Align Center',\n onClick: () => this.onTextAlign('center'),\n },\n {\n showBtn: this.showAlignRightButton,\n selector: { textAlign: 'right' },\n icon: DtIconAlignRight,\n dataQA: 'dt-recipe-editor-align-right-btn',\n tooltipMessage: 'Align Right',\n onClick: () => this.onTextAlign('right'),\n },\n {\n showBtn: this.showAlignJustifyButton,\n selector: { textAlign: 'justify' },\n icon: DtIconAlignJustify,\n dataQA: 'dt-recipe-editor-align-justify-btn',\n tooltipMessage: 'Align Justify',\n onClick: () => this.onTextAlign('justify'),\n },\n ].filter(button => button.showBtn);\n },\n\n listButtons () {\n return [\n {\n showBtn: this.showListItemsButton,\n selector: 'bulletList',\n icon: DtIconListBullet,\n dataQA: 'dt-recipe-editor-list-items-btn',\n tooltipMessage: 'Bullet List',\n onClick: this.onBulletListToggle,\n },\n {\n showBtn: this.showOrderedListButton,\n selector: 'orderedList',\n icon: DtIconListOrdered,\n dataQA: 'dt-recipe-editor-ordered-list-items-btn',\n tooltipMessage: 'Ordered List',\n onClick: this.onOrderedListToggle,\n },\n ].filter(button => button.showBtn);\n },\n\n individualButtons () {\n return [\n {\n showBtn: this.showQuoteButton,\n selector: 'blockquote',\n icon: DtIconQuote,\n dataQA: 'dt-recipe-editor-blockquote-btn',\n tooltipMessage: 'Quote',\n onClick: this.onBlockquoteToggle,\n },\n {\n showBtn: this.showCodeBlockButton,\n selector: 'codeBlock',\n icon: DtIconCodeBlock,\n dataQA: 'dt-recipe-editor-code-block-btn',\n tooltipMessage: 'Code',\n onClick: this.onCodeBlockToggle,\n },\n {\n showBtn: this.showInlineImageButton,\n selector: 'image',\n icon: DtIconImage,\n dataQA: 'dt-recipe-editor-inline-image-btn',\n tooltipMessage: 'Image',\n onClick: this.onInsertInlineImageClick,\n },\n ].filter(button => button.showBtn);\n },\n\n linkButton () {\n return {\n showBtn: this.showAddLink.showAddLinkButton,\n selector: 'link',\n icon: DtIconLink2,\n dataQA: 'dt-recipe-editor-add-link-btn',\n tooltipMessage: 'Link',\n onClick: this.openLinkInput,\n };\n },\n\n },\n\n watch: {\n value (newValue) {\n this.internalInputValue = newValue;\n },\n },\n\n methods: {\n onInputFocus (event) {\n event?.stopPropagation();\n },\n\n removeLink () {\n this.$refs.richTextEditor?.editor?.chain()?.focus()?.unsetLink()?.run();\n this.closeLinkInput();\n },\n\n setLink (event) {\n const editor = this.$refs.richTextEditor?.editor;\n event?.preventDefault();\n event?.stopPropagation();\n\n if (!this.linkInput) {\n // If link text is set to empty string,\n // remove any existing links.\n this.removeLink();\n return;\n }\n\n // Check if input matches any of the supported link formats\n const prefix = EDITOR_SUPPORTED_LINK_PROTOCOLS.find(prefixRegex => prefixRegex.test(this.linkInput));\n\n if (!prefix) {\n // If no matching pattern is found, prepend default prefix\n this.linkInput = `${EDITOR_DEFAULT_LINK_PREFIX}${this.linkInput}`;\n }\n\n const selection = editor?.view?.state?.selection;\n\n if (selection.anchor === selection.head) {\n // If no text has been selected, manually insert the link text.\n // Do not rely on link options set through DtRichTextEditor\n // component, because they clash with these and cause issues.\n editor\n .chain()\n .focus()\n .insertContentAt(\n selection.anchor,\n `<a class=\"${this.linkOptions.class}\" href=${this.linkInput}>${this.linkInput}</a>`,\n )\n .run();\n } else {\n // Set or edit the link\n editor\n .chain()\n .focus()\n .extendMarkRange('link')\n .setLink({ href: this.linkInput, class: this.linkOptions.class })\n .run();\n }\n\n this.closeLinkInput();\n },\n\n openLinkInput () {\n this.showLinkInput = true;\n },\n\n updateInput (openedInput) {\n if (!openedInput) {\n return this.closeLinkInput();\n }\n this.linkInput = this.$refs.richTextEditor?.editor?.getAttributes('link')?.href;\n },\n\n closeLinkInput () {\n this.showLinkInput = false;\n this.linkInput = '';\n this.$refs.richTextEditor.editor?.chain().focus();\n },\n\n onBoldTextToggle () {\n this.$refs.richTextEditor?.editor?.chain().focus().toggleBold().run();\n },\n\n onItalicTextToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleItalic().run();\n },\n\n onUnderlineTextToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleUnderline().run();\n },\n\n onStrikethroughTextToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleStrike().run();\n },\n\n onTextAlign (alignment) {\n if (this.$refs.richTextEditor?.editor?.isActive({ textAlign: alignment })) {\n // If this alignment type is already set here, unset it\n return this.$refs.richTextEditor?.editor.chain().focus().unsetTextAlign().run();\n }\n this.$refs.richTextEditor?.editor.chain().focus().setTextAlign(alignment).run();\n },\n\n onBulletListToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleBulletList().run();\n },\n\n onOrderedListToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleOrderedList().run();\n },\n\n onCodeBlockToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleCodeBlock().run();\n },\n\n onQuickRepliesClick () {\n this.$emit('quick-replies-click');\n },\n\n onInsertInlineImageClick () {\n this.$emit('inline-image-click');\n },\n\n insertInlineImage (imageUrl) {\n this.$refs.richTextEditor?.editor.chain().focus().setImage({ src: imageUrl }).run();\n },\n\n onBlockquoteToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleBlockquote().run();\n },\n\n insertInMessageBody (messageContent) {\n this.$refs.richTextEditor?.editor.chain().focus().insertContent(messageContent).run();\n },\n\n setCursorPosition (position = null) {\n this.$refs.richTextEditor?.editor.chain().focus(position).run();\n },\n\n onTextInput (event) {\n this.$emit('text-input', event);\n },\n\n onFocus (event) {\n this.hasFocus = true;\n this.$emit('focus', event);\n },\n\n onBlur (event) {\n this.hasFocus = false;\n this.$emit('blur', event);\n },\n\n onInput (event) {\n this.$emit('input', event);\n },\n\n getButtonKey (key, selector) {\n return `${key}-${JSON.stringify(selector)}`;\n },\n\n // Unique Button Ref Key to identify ref\n getButtonRef (key, selector) {\n return `${this.getButtonKey(key, selector)}-ref`;\n },\n\n /**\n * Determines if an element in the action bar button list is focusable with tab key\n * @param {string} refKey - unique identifier for the ref element in DOM\n */\n canFocus (refKey) {\n return refKey === this.orderedRefs[this.currentButtonRefIndex];\n },\n\n shiftActionBarFocusRight () {\n this.shiftButtonRefIndex(1);\n },\n\n shiftActionBarFocusLeft () {\n this.shiftButtonRefIndex(-1);\n },\n\n shiftButtonRefIndex (shiftAmount) {\n const previousRef = this.buttonRefMap[this.orderedRefs[this.currentButtonRefIndex]];\n const index = (this.currentButtonRefIndex + shiftAmount) % this.orderedRefs.length;\n this.currentButtonRefIndex = index >= 0 ? index : this.orderedRefs.length + index;\n const currentRef = this.buttonRefMap[this.orderedRefs[this.currentButtonRefIndex]];\n previousRef.$el.blur();\n currentRef.$el.focus();\n },\n },\n};\n</script>\n"],"names":["_sfc_main","DtRichTextEditor","DtButton","DtPopover","DtStack","DtInput","DtTooltip","DtIconLightningBolt","DtIconBold","DtIconItalic","DtIconUnderline","DtIconStrikethrough","DtIconListBullet","DtIconListOrdered","DtIconAlignLeft","DtIconAlignCenter","DtIconAlignRight","DtIconAlignJustify","DtIconQuote","DtIconCodeBlock","DtIconLink2","DtIconImage","autoFocus","RICH_TEXT_EDITOR_AUTOFOCUS_TYPES","ref","RICH_TEXT_EDITOR_OUTPUT_FORMATS","refs","acc","buttonData","button","individualButtonStacks","buttonGroupData","newValue","event","_e","_d","_c","_b","_a","editor","EDITOR_SUPPORTED_LINK_PROTOCOLS","prefixRegex","EDITOR_DEFAULT_LINK_PREFIX","selection","openedInput","alignment","imageUrl","messageContent","position","key","selector","refKey","shiftAmount","previousRef","index","currentRef"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"editor.js","sources":["../../../recipes/conversation_view/editor/editor.vue"],"sourcesContent":["<template>\n <div\n\n class=\"d-recipe-editor\"\n data-qa=\"dt-recipe-editor\"\n role=\"presentation\"\n @click=\"$refs.richTextEditor.focusEditor()\"\n >\n <!-- Section for the top UI -->\n <dt-stack\n class=\"d-recipe-editor__top-bar\"\n direction=\"row\"\n gap=\"450\"\n >\n <dt-stack\n v-for=\"buttonGroup in buttonGroups\"\n :key=\"buttonGroup.key\"\n direction=\"row\"\n gap=\"300\"\n >\n <dt-tooltip\n v-for=\"button in buttonGroup.buttonGroup\"\n :key=\"getButtonKey(buttonGroup.key, button.selector)\"\n :message=\"button.tooltipMessage\"\n placement=\"top\"\n >\n <template #anchor>\n <dt-button\n :ref=\"(el) => { buttonRefMap[getButtonRef(buttonGroup.key, button.selector)] = el }\"\n :active=\"$refs.richTextEditor?.editor?.isActive(button.selector)\"\n :aria-label=\"button.tooltipMessage\"\n :data-qa=\"button.dataQA\"\n :tabindex=\"canFocus(getButtonRef(buttonGroup.key, button.selector)) ? 0 : -1\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"xs\"\n @click=\"button.onClick()\"\n @keydown.right.stop=\"shiftActionBarFocusRight\"\n @keydown.left.stop=\"shiftActionBarFocusLeft\"\n >\n <template #icon>\n <component\n :is=\"button.icon\"\n size=\"200\"\n />\n </template>\n <span v-if=\"button.label\">{{ button.label }}</span>\n </dt-button>\n </template>\n </dt-tooltip>\n <div class=\"d-recipe-editor__button-group-divider\" />\n </dt-stack>\n <dt-stack\n v-if=\"linkButton.showBtn\"\n direction=\"row\"\n gap=\"300\"\n >\n <dt-popover\n :open.sync=\"showLinkInput\"\n :show-close-button=\"false\"\n :visually-hidden-close=\"true\"\n :visually-hidden-close-label=\"'Close link input popover'\"\n data-qa=\"dt-recipe-editor-link-input-popover\"\n padding=\"none\"\n placement=\"bottom-start\"\n @click=\"onInputFocus\"\n @opened=\"updateInput\"\n @click.native.stop=\"onInputFocus\"\n >\n <template #anchor>\n <dt-tooltip\n :key=\"linkButton.key\"\n :message=\"linkButton.tooltipMessage\"\n placement=\"top\"\n >\n <template #anchor>\n <dt-button\n :ref=\"(el) => { buttonRefMap[getButtonRef('custom', 'link')] = el }\"\n :active=\"$refs.richTextEditor?.editor?.isActive(linkButton.selector)\"\n :aria-label=\"linkButton.tooltipMessage\"\n :data-qa=\"linkButton.dataQA\"\n :tabindex=\"canFocus(getButtonRef('custom', 'link')) ? 0 : -1\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"xs\"\n @click=\"linkButton.onClick()\"\n @keydown.right.stop=\"shiftActionBarFocusRight\"\n @keydown.left.stop=\"shiftActionBarFocusLeft\"\n >\n <template #icon>\n <component\n :is=\"linkButton.icon\"\n size=\"200\"\n />\n </template>\n </dt-button>\n </template>\n </dt-tooltip>\n </template>\n\n <template #content>\n <div class=\"d-recipe-editor__popover-content\">\n <span\n v-if=\"showAddLink.setLinkTitle.length > 0\"\n >\n {{ showAddLink.setLinkTitle }}\n </span>\n <dt-input\n v-model=\"linkInput\"\n :input-aria-label=\"showAddLink.setLinkInputAriaLabel\"\n :placeholder=\"setLinkPlaceholder\"\n data-qa=\"dt-recipe-editor-link-input\"\n input-wrapper-class=\"d-recipe-editor-link__input-wrapper\"\n @click=\"onInputFocus\"\n @focus=\"onInputFocus\"\n @click.native.stop=\"onInputFocus\"\n @keydown.enter=\"setLink\"\n />\n </div>\n </template>\n <template #footerContent>\n <dt-stack\n direction=\"row\"\n gap=\"300\"\n class=\"d-recipe-editor__popover-footer\"\n >\n <dt-button\n :aria-label=\"removeLinkButton.ariaLabel\"\n data-qa=\"dt-recipe-editor-remove-link-btn\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"sm\"\n @click=\"removeLink\"\n >\n {{ removeLinkButton.label }}\n </dt-button>\n <dt-button\n :aria-label=\"cancelSetLinkButton.ariaLabel\"\n data-qa=\"dt-recipe-editor-set-link-cancel-btn\"\n importance=\"clear\"\n kind=\"muted\"\n size=\"sm\"\n @click=\"closeLinkInput\"\n >\n {{ cancelSetLinkButton.label }}\n </dt-button>\n <dt-button\n :aria-label=\"confirmSetLinkButton.ariaLabel\"\n data-qa=\"dt-recipe-editor-set-link-confirm-btn\"\n size=\"sm\"\n @click=\"setLink\"\n >\n {{ confirmSetLinkButton.label }}\n </dt-button>\n </dt-stack>\n </template>\n </dt-popover>\n </dt-stack>\n </dt-stack>\n\n <!-- Some wrapper to restrict the height and show the scrollbar -->\n <div\n :style=\"{ 'max-height': maxHeight }\"\n class=\"d-recipe-editor__content\"\n >\n <dt-rich-text-editor\n ref=\"richTextEditor\"\n v-model=\"internalInputValue\"\n :allow-inline-images=\"true\"\n :allow-line-breaks=\"true\"\n :hide-link-bubble-menu=\"true\"\n :auto-focus=\"autoFocus\"\n :editable=\"editable\"\n :input-aria-label=\"inputAriaLabel\"\n :input-class=\"`d-recipe-editor__content-input ${inputClass}`\"\n :link=\"true\"\n :output-format=\"htmlOutputFormat\"\n :placeholder=\"placeholder\"\n :use-div-tags=\"useDivTags\"\n data-qa=\"dt-rich-text-editor\"\n v-bind=\"$attrs\"\n @text-input=\"onTextInput\"\n @blur=\"onBlur\"\n @focus=\"onFocus\"\n @input=\"onInput($event)\"\n />\n </div>\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 {\n EDITOR_SUPPORTED_LINK_PROTOCOLS,\n EDITOR_DEFAULT_LINK_PREFIX,\n} from './editor_constants.js';\nimport { DtButton } from '@/components/button';\nimport { DtPopover } from '@/components/popover';\nimport { DtStack } from '@/components/stack';\nimport { DtInput } from '@/components/input';\nimport { DtTooltip } from '@/components/tooltip';\nimport {\n DtIconAlignCenter,\n DtIconAlignJustify,\n DtIconAlignLeft,\n DtIconAlignRight,\n DtIconBold,\n DtIconCodeBlock,\n DtIconImage,\n DtIconItalic,\n DtIconQuickReply,\n DtIconLink2,\n DtIconListBullet,\n DtIconListOrdered,\n DtIconQuote,\n DtIconStrikethrough,\n DtIconUnderline,\n} from '@dialpad/dialtone-icons/vue2';\nimport { ref } from 'vue';\n\nexport default {\n name: 'DtRecipeEditor',\n\n components: {\n DtRichTextEditor,\n DtButton,\n DtPopover,\n DtStack,\n DtInput,\n DtTooltip,\n DtIconQuickReply,\n DtIconBold,\n DtIconItalic,\n DtIconUnderline,\n DtIconStrikethrough,\n DtIconListBullet,\n DtIconListOrdered,\n DtIconAlignLeft,\n DtIconAlignCenter,\n DtIconAlignRight,\n DtIconAlignJustify,\n DtIconQuote,\n DtIconCodeBlock,\n DtIconLink2,\n DtIconImage,\n },\n\n inheritAttrs: false,\n\n props: {\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 value: {\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 * 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 * Placeholder text\n */\n placeholder: {\n type: String,\n default: '',\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 /**\n * Confirm set link button defaults.\n */\n confirmSetLinkButton: {\n type: Object,\n default: () => ({ label: 'Confirm', ariaLabel: 'Confirm set link' }),\n },\n\n /**\n * Remove link button defaults.\n */\n removeLinkButton: {\n type: Object,\n default: () => ({ label: 'Remove', ariaLabel: 'Remove link' }),\n },\n\n /**\n * Cancel set link button defaults.\n */\n cancelSetLinkButton: {\n type: Object,\n default: () => ({ label: 'Cancel', ariaLabel: 'Cancel set link' }),\n },\n\n /**\n * Placeholder text for the set link input field\n */\n setLinkPlaceholder: {\n type: String,\n default: '',\n },\n\n /**\n * Show button to render text as bold\n */\n showBoldButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to render text in italics\n */\n showItalicsButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to underline text\n */\n showUnderlineButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to strike text\n */\n showStrikeButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to render list items\n */\n showListItemsButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to render ordered list items\n */\n showOrderedListButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to align text to the left\n */\n showAlignLeftButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to align text to the center\n */\n showAlignCenterButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to align text to the right\n */\n showAlignRightButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to justify text\n */\n showAlignJustifyButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to add quote format to text\n */\n showQuoteButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to add code block\n */\n showCodeBlockButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to handle quick replies\n */\n showQuickRepliesButton: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Show button to add an inline image\n */\n showInlineImageButton: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Show add link default config.\n */\n showAddLink: {\n type: Object,\n default: () => ({\n showAddLinkButton: true,\n setLinkTitle: 'Add a link',\n setLinkInputAriaLabel: 'Input field to add link',\n }),\n },\n\n /**\n * Use div tags instead of paragraph tags to show text\n */\n useDivTags: {\n type: Boolean,\n default: false,\n },\n },\n\n emits: [\n /**\n * Native focus event\n * @event input\n * @type {String|JSON}\n */\n 'focus',\n\n /**\n * Native blur event\n * @event input\n * @type {String|JSON}\n */\n 'blur',\n\n /**\n * Native input event\n * @event input\n * @type {String|JSON}\n */\n 'input',\n\n /**\n * Quick replies button\n * pressed event\n * @event quick-replies-click\n */\n 'quick-replies-click',\n\n /**\n * Emit when inline image button is clicked\n * @event inline-image-click\n */\n 'inline-image-click',\n\n /**\n * Emit when text content changes (not raw html)\n */\n 'text-input',\n ],\n\n data () {\n return {\n internalInputValue: this.value, // internal input content\n hasFocus: false,\n\n linkOptions: {\n class: 'd-recipe-editor__link',\n },\n\n showLinkInput: false,\n linkInput: '',\n currentButtonRefIndex: 0,\n buttonRefMap: ref({}),\n };\n },\n\n computed: {\n inputLength () {\n return this.internalInputValue.length;\n },\n\n htmlOutputFormat () {\n return RICH_TEXT_EDITOR_OUTPUT_FORMATS[2];\n },\n\n showingTextFormatButtons () {\n return this.showBoldButton || this.showItalicsButton || this.showStrikeButton || this.showUnderlineButton;\n },\n\n showingAlignmentButtons () {\n return this.showAlignLeftButton || this.showAlignCenterButton ||\n this.showAlignRightButton || this.showAlignJustifyButton;\n },\n\n showingListButtons () {\n return this.showListItemsButton || this.showOrderedListButton;\n },\n\n orderedRefs () {\n const refs = this.buttonGroups.reduce(function (acc, buttonData) {\n buttonData.buttonGroup.forEach(button => {\n acc.push(this.getButtonRef(buttonData.key, button.selector));\n }, this);\n return acc;\n }.bind(this), []);\n refs.push(this.getButtonRef('custom', 'link'));\n return refs;\n },\n\n buttonGroups () {\n const individualButtonStacks = this.individualButtons.map(buttonData => ({\n key: buttonData.selector,\n buttonGroup: [buttonData],\n }));\n return [\n { key: 'new', buttonGroup: this.newButtons },\n { key: 'format', buttonGroup: this.textFormatButtons },\n { key: 'alignment', buttonGroup: this.alignmentButtons },\n { key: 'list', buttonGroup: this.listButtons },\n ...individualButtonStacks,\n ].filter(buttonGroupData => buttonGroupData.buttonGroup.length > 0);\n },\n\n newButtons () {\n return [\n {\n showBtn: this.showQuickRepliesButton,\n label: 'Quick reply',\n selector: 'quickReplies',\n icon: DtIconQuickReply,\n dataQA: 'dt-recipe-editor-quick-replies-btn',\n tooltipMessage: 'Quick Reply',\n onClick: this.onQuickRepliesClick,\n },\n ].filter(button => button.showBtn);\n },\n\n textFormatButtons () {\n return [\n {\n showBtn: this.showBoldButton,\n selector: 'bold',\n icon: DtIconBold,\n dataQA: 'dt-recipe-editor-bold-btn',\n tooltipMessage: 'Bold',\n onClick: this.onBoldTextToggle,\n },\n {\n showBtn: this.showItalicsButton,\n selector: 'italic',\n icon: DtIconItalic,\n dataQA: 'dt-recipe-editor-italics-btn',\n tooltipMessage: 'Italics',\n onClick: this.onItalicTextToggle,\n },\n {\n showBtn: this.showUnderlineButton,\n selector: 'underline',\n icon: DtIconUnderline,\n dataQA: 'dt-recipe-editor-underline-btn',\n tooltipMessage: 'Underline',\n onClick: this.onUnderlineTextToggle,\n },\n {\n showBtn: this.showStrikeButton,\n selector: 'strike',\n icon: DtIconStrikethrough,\n dataQA: 'dt-recipe-editor-strike-btn',\n tooltipMessage: 'Strike',\n onClick: this.onStrikethroughTextToggle,\n },\n ].filter(button => button.showBtn);\n },\n\n alignmentButtons () {\n return [\n {\n showBtn: this.showAlignLeftButton,\n selector: { textAlign: 'left' },\n icon: DtIconAlignLeft,\n dataQA: 'dt-recipe-editor-align-left-btn',\n tooltipMessage: 'Align Left',\n onClick: () => this.onTextAlign('left'),\n },\n {\n showBtn: this.showAlignCenterButton,\n selector: { textAlign: 'center' },\n icon: DtIconAlignCenter,\n dataQA: 'dt-recipe-editor-align-center-btn',\n tooltipMessage: 'Align Center',\n onClick: () => this.onTextAlign('center'),\n },\n {\n showBtn: this.showAlignRightButton,\n selector: { textAlign: 'right' },\n icon: DtIconAlignRight,\n dataQA: 'dt-recipe-editor-align-right-btn',\n tooltipMessage: 'Align Right',\n onClick: () => this.onTextAlign('right'),\n },\n {\n showBtn: this.showAlignJustifyButton,\n selector: { textAlign: 'justify' },\n icon: DtIconAlignJustify,\n dataQA: 'dt-recipe-editor-align-justify-btn',\n tooltipMessage: 'Align Justify',\n onClick: () => this.onTextAlign('justify'),\n },\n ].filter(button => button.showBtn);\n },\n\n listButtons () {\n return [\n {\n showBtn: this.showListItemsButton,\n selector: 'bulletList',\n icon: DtIconListBullet,\n dataQA: 'dt-recipe-editor-list-items-btn',\n tooltipMessage: 'Bullet List',\n onClick: this.onBulletListToggle,\n },\n {\n showBtn: this.showOrderedListButton,\n selector: 'orderedList',\n icon: DtIconListOrdered,\n dataQA: 'dt-recipe-editor-ordered-list-items-btn',\n tooltipMessage: 'Ordered List',\n onClick: this.onOrderedListToggle,\n },\n ].filter(button => button.showBtn);\n },\n\n individualButtons () {\n return [\n {\n showBtn: this.showQuoteButton,\n selector: 'blockquote',\n icon: DtIconQuote,\n dataQA: 'dt-recipe-editor-blockquote-btn',\n tooltipMessage: 'Quote',\n onClick: this.onBlockquoteToggle,\n },\n {\n showBtn: this.showCodeBlockButton,\n selector: 'codeBlock',\n icon: DtIconCodeBlock,\n dataQA: 'dt-recipe-editor-code-block-btn',\n tooltipMessage: 'Code',\n onClick: this.onCodeBlockToggle,\n },\n {\n showBtn: this.showInlineImageButton,\n selector: 'image',\n icon: DtIconImage,\n dataQA: 'dt-recipe-editor-inline-image-btn',\n tooltipMessage: 'Image',\n onClick: this.onInsertInlineImageClick,\n },\n ].filter(button => button.showBtn);\n },\n\n linkButton () {\n return {\n showBtn: this.showAddLink.showAddLinkButton,\n selector: 'link',\n icon: DtIconLink2,\n dataQA: 'dt-recipe-editor-add-link-btn',\n tooltipMessage: 'Link',\n onClick: this.openLinkInput,\n };\n },\n\n },\n\n watch: {\n value (newValue) {\n this.internalInputValue = newValue;\n },\n },\n\n methods: {\n onInputFocus (event) {\n event?.stopPropagation();\n },\n\n removeLink () {\n this.$refs.richTextEditor?.editor?.chain()?.focus()?.unsetLink()?.run();\n this.closeLinkInput();\n },\n\n setLink (event) {\n const editor = this.$refs.richTextEditor?.editor;\n event?.preventDefault();\n event?.stopPropagation();\n\n if (!this.linkInput) {\n // If link text is set to empty string,\n // remove any existing links.\n this.removeLink();\n return;\n }\n\n // Check if input matches any of the supported link formats\n const prefix = EDITOR_SUPPORTED_LINK_PROTOCOLS.find(prefixRegex => prefixRegex.test(this.linkInput));\n\n if (!prefix) {\n // If no matching pattern is found, prepend default prefix\n this.linkInput = `${EDITOR_DEFAULT_LINK_PREFIX}${this.linkInput}`;\n }\n\n const selection = editor?.view?.state?.selection;\n\n if (selection.anchor === selection.head) {\n // If no text has been selected, manually insert the link text.\n // Do not rely on link options set through DtRichTextEditor\n // component, because they clash with these and cause issues.\n editor\n .chain()\n .focus()\n .insertContentAt(\n selection.anchor,\n `<a class=\"${this.linkOptions.class}\" href=${this.linkInput}>${this.linkInput}</a>`,\n )\n .run();\n } else {\n // Set or edit the link\n editor\n .chain()\n .focus()\n .extendMarkRange('link')\n .setLink({ href: this.linkInput, class: this.linkOptions.class })\n .run();\n }\n\n this.closeLinkInput();\n },\n\n openLinkInput () {\n this.showLinkInput = true;\n },\n\n updateInput (openedInput) {\n if (!openedInput) {\n return this.closeLinkInput();\n }\n this.linkInput = this.$refs.richTextEditor?.editor?.getAttributes('link')?.href;\n },\n\n closeLinkInput () {\n this.showLinkInput = false;\n this.linkInput = '';\n this.$refs.richTextEditor.editor?.chain().focus();\n },\n\n onBoldTextToggle () {\n this.$refs.richTextEditor?.editor?.chain().focus().toggleBold().run();\n },\n\n onItalicTextToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleItalic().run();\n },\n\n onUnderlineTextToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleUnderline().run();\n },\n\n onStrikethroughTextToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleStrike().run();\n },\n\n onTextAlign (alignment) {\n if (this.$refs.richTextEditor?.editor?.isActive({ textAlign: alignment })) {\n // If this alignment type is already set here, unset it\n return this.$refs.richTextEditor?.editor.chain().focus().unsetTextAlign().run();\n }\n this.$refs.richTextEditor?.editor.chain().focus().setTextAlign(alignment).run();\n },\n\n onBulletListToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleBulletList().run();\n },\n\n onOrderedListToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleOrderedList().run();\n },\n\n onCodeBlockToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleCodeBlock().run();\n },\n\n onQuickRepliesClick () {\n this.$emit('quick-replies-click');\n },\n\n onInsertInlineImageClick () {\n this.$emit('inline-image-click');\n },\n\n insertInlineImage (imageUrl) {\n this.$refs.richTextEditor?.editor.chain().focus().setImage({ src: imageUrl }).run();\n },\n\n onBlockquoteToggle () {\n this.$refs.richTextEditor?.editor.chain().focus().toggleBlockquote().run();\n },\n\n insertInMessageBody (messageContent) {\n this.$refs.richTextEditor?.editor.chain().focus().insertContent(messageContent).run();\n },\n\n setCursorPosition (position = null) {\n this.$refs.richTextEditor?.editor.chain().focus(position).run();\n },\n\n onTextInput (event) {\n this.$emit('text-input', event);\n },\n\n onFocus (event) {\n this.hasFocus = true;\n this.$emit('focus', event);\n },\n\n onBlur (event) {\n this.hasFocus = false;\n this.$emit('blur', event);\n },\n\n onInput (event) {\n this.$emit('input', event);\n },\n\n getButtonKey (key, selector) {\n return `${key}-${JSON.stringify(selector)}`;\n },\n\n // Unique Button Ref Key to identify ref\n getButtonRef (key, selector) {\n return `${this.getButtonKey(key, selector)}-ref`;\n },\n\n /**\n * Determines if an element in the action bar button list is focusable with tab key\n * @param {string} refKey - unique identifier for the ref element in DOM\n */\n canFocus (refKey) {\n return refKey === this.orderedRefs[this.currentButtonRefIndex];\n },\n\n shiftActionBarFocusRight () {\n this.shiftButtonRefIndex(1);\n },\n\n shiftActionBarFocusLeft () {\n this.shiftButtonRefIndex(-1);\n },\n\n shiftButtonRefIndex (shiftAmount) {\n const previousRef = this.buttonRefMap[this.orderedRefs[this.currentButtonRefIndex]];\n const index = (this.currentButtonRefIndex + shiftAmount) % this.orderedRefs.length;\n this.currentButtonRefIndex = index >= 0 ? index : this.orderedRefs.length + index;\n const currentRef = this.buttonRefMap[this.orderedRefs[this.currentButtonRefIndex]];\n previousRef.$el.blur();\n currentRef.$el.focus();\n },\n },\n};\n</script>\n"],"names":["_sfc_main","DtRichTextEditor","DtButton","DtPopover","DtStack","DtInput","DtTooltip","DtIconQuickReply","DtIconBold","DtIconItalic","DtIconUnderline","DtIconStrikethrough","DtIconListBullet","DtIconListOrdered","DtIconAlignLeft","DtIconAlignCenter","DtIconAlignRight","DtIconAlignJustify","DtIconQuote","DtIconCodeBlock","DtIconLink2","DtIconImage","autoFocus","RICH_TEXT_EDITOR_AUTOFOCUS_TYPES","ref","RICH_TEXT_EDITOR_OUTPUT_FORMATS","refs","acc","buttonData","button","individualButtonStacks","buttonGroupData","newValue","event","_e","_d","_c","_b","_a","editor","EDITOR_SUPPORTED_LINK_PROTOCOLS","prefixRegex","EDITOR_DEFAULT_LINK_PREFIX","selection","openedInput","alignment","imageUrl","messageContent","position","key","selector","refKey","shiftAmount","previousRef","index","currentRef"],"mappings":"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"}
|