@ni/nimble-components 34.5.2 → 34.6.1
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/all-components-bundle.js +24216 -22330
- package/dist/all-components-bundle.js.map +1 -1
- package/dist/all-components-bundle.min.js +5186 -4815
- package/dist/all-components-bundle.min.js.map +1 -1
- package/dist/esm/dialog/template.js +1 -0
- package/dist/esm/dialog/template.js.map +1 -1
- package/dist/esm/drawer/template.js +1 -0
- package/dist/esm/drawer/template.js.map +1 -1
- package/dist/esm/rich-text/editor/index.js +11 -6
- package/dist/esm/rich-text/editor/index.js.map +1 -1
- package/dist/esm/rich-text/editor/models/create-tiptap-editor.js +13 -14
- package/dist/esm/rich-text/editor/models/create-tiptap-editor.js.map +1 -1
- package/package.json +13 -15
|
@@ -8,6 +8,7 @@ export const template = html `
|
|
|
8
8
|
@cancel="${(x, c) => x.cancelHandler(c.event)}"
|
|
9
9
|
@close="${(x, c) => x.closeHandler(c.event)}"
|
|
10
10
|
aria-labelledby="header"
|
|
11
|
+
closedby="${x => (x.preventDismiss ? 'none' : 'closerequest')}"
|
|
11
12
|
>
|
|
12
13
|
<header id="header">
|
|
13
14
|
<div class="title">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/dialog/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGtD,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAQ;;;cAGtB,GAAG,CAAC,eAAe,CAAC;;;uBAGX,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;sBACnC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/dialog/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAGtD,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAQ;;;cAGtB,GAAG,CAAC,eAAe,CAAC;;;uBAGX,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;sBACnC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;;wBAE/B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;;;;;;;;;;;;;6BAa5C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;;;sBAG5C,OAAO,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC;;;;;CAKnE,CAAC","sourcesContent":["import { html, ref, slotted } from '@ni/fast-element';\nimport type { Dialog } from '.';\n\nexport const template = html<Dialog>`\n <template>\n <dialog\n ${ref('dialogElement')}\n role=\"dialog\"\n part=\"control\"\n @cancel=\"${(x, c) => x.cancelHandler(c.event)}\"\n @close=\"${(x, c) => x.closeHandler(c.event)}\"\n aria-labelledby=\"header\"\n closedby=\"${x => (x.preventDismiss ? 'none' : 'closerequest')}\"\n >\n <header id=\"header\">\n <div class=\"title\">\n <slot name=\"title\"></slot>\n </div>\n <div class=\"subtitle\">\n <slot name=\"subtitle\"></slot>\n </div>\n </header>\n <section>\n <slot></slot>\n </section>\n <footer class=\"${x => (x.footerIsEmpty ? 'empty' : '')}\">\n <slot\n name=\"footer\"\n ${slotted({ property: 'slottedFooterElements' })}\n ></slot>\n </footer>\n </dialog>\n </template>\n`;\n"]}
|
|
@@ -5,6 +5,7 @@ export const template = html `
|
|
|
5
5
|
aria-label="${x => x.ariaLabel}"
|
|
6
6
|
@cancel="${(x, c) => x.cancelHandler(c.event)}"
|
|
7
7
|
@close="${(x, c) => x.closeHandler(c.event)}"
|
|
8
|
+
closedby="${x => (x.preventDismiss ? 'none' : 'closerequest')}"
|
|
8
9
|
>
|
|
9
10
|
<div class="dialog-contents">
|
|
10
11
|
<slot></slot>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/drawer/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAG7C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAQ;;UAE1B,GAAG,CAAC,QAAQ,CAAC;sBACD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;mBACnB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;kBACnC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;;;;;;
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/drawer/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAG7C,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAQ;;UAE1B,GAAG,CAAC,QAAQ,CAAC;sBACD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;mBACnB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;kBACnC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;oBAC/B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;;;;;;CAMpE,CAAC","sourcesContent":["import { html, ref } from '@ni/fast-element';\nimport type { Drawer } from '.';\n\nexport const template = html<Drawer>`\n <dialog\n ${ref('dialog')}\n aria-label=\"${x => x.ariaLabel}\"\n @cancel=\"${(x, c) => x.cancelHandler(c.event)}\"\n @close=\"${(x, c) => x.closeHandler(c.event)}\"\n closedby=\"${x => (x.preventDismiss ? 'none' : 'closerequest')}\"\n >\n <div class=\"dialog-contents\">\n <slot></slot>\n </div>\n </dialog>\n`;\n"]}
|
|
@@ -2,7 +2,7 @@ import { __decorate } from "tslib";
|
|
|
2
2
|
import { observable, attr, DOM } from '@ni/fast-element';
|
|
3
3
|
import { applyMixins, ARIAGlobalStatesAndProperties, DesignSystem } from '@ni/fast-foundation';
|
|
4
4
|
import { keyEnter, keySpace } from '@ni/fast-web-utilities';
|
|
5
|
-
import { findParentNode, isList,
|
|
5
|
+
import { findParentNode, isList, Editor } from '@tiptap/core';
|
|
6
6
|
import HardBreak from '@tiptap/extension-hard-break';
|
|
7
7
|
import { template } from './template';
|
|
8
8
|
import { styles } from './styles';
|
|
@@ -118,10 +118,15 @@ export class RichTextEditor extends mixinErrorPattern(RichText) {
|
|
|
118
118
|
* @internal
|
|
119
119
|
*/
|
|
120
120
|
placeholderChanged(_prev, _next) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
121
|
+
// In TipTap v3, extension options cannot be modified after initialization.
|
|
122
|
+
// We need to reinitialize the editor with the new placeholder value.
|
|
123
|
+
// This workaround will be updated once the upstream issue is resolved.
|
|
124
|
+
// See: https://github.com/ni/nimble/issues/2752
|
|
125
|
+
const currentContent = this.getMarkdown();
|
|
126
|
+
const { from, to } = this.tiptapEditor.view.state.selection;
|
|
127
|
+
this.initializeEditor(); // Destroys and recreates entire editor
|
|
128
|
+
this.setMarkdown(currentContent);
|
|
129
|
+
this.tiptapEditor.commands.setTextSelection({ from, to });
|
|
125
130
|
}
|
|
126
131
|
/**
|
|
127
132
|
* @internal
|
|
@@ -249,7 +254,7 @@ export class RichTextEditor extends mixinErrorPattern(RichText) {
|
|
|
249
254
|
*/
|
|
250
255
|
setMarkdown(markdown) {
|
|
251
256
|
const html = this.getHtmlContent(markdown);
|
|
252
|
-
this.tiptapEditor.commands.setContent(html);
|
|
257
|
+
this.tiptapEditor.commands.setContent(html, { emitUpdate: false });
|
|
253
258
|
this.disableMentionViewElement();
|
|
254
259
|
}
|
|
255
260
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text/editor/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { observable, attr, DOM } from '@ni/fast-element';\nimport {\n applyMixins,\n ARIAGlobalStatesAndProperties,\n DesignSystem\n} from '@ni/fast-foundation';\nimport { keyEnter, keySpace } from '@ni/fast-web-utilities';\nimport {\n findParentNode,\n isList,\n type AnyExtension,\n Extension,\n Editor\n} from '@tiptap/core';\n\nimport type { PlaceholderOptions } from '@tiptap/extension-placeholder';\nimport HardBreak from '@tiptap/extension-hard-break';\nimport type { SuggestionProps } from '@tiptap/suggestion';\nimport { template } from './template';\nimport { styles } from './styles';\nimport type { ToggleButton } from '../../toggle-button';\nimport {\n TipTapNodeName,\n mentionPluginPrefix,\n type MentionDetail,\n type FormatButtonsState\n} from './types';\nimport { mixinErrorPattern } from '../../patterns/error/types';\nimport { RichTextMarkdownParser } from '../models/markdown-parser';\nimport { RichTextMarkdownSerializer } from '../models/markdown-serializer';\nimport { RichText } from '../base';\nimport type { RichTextMentionListbox } from '../mention-listbox';\nimport type { MappingConfigs } from '../../rich-text-mention/base/types';\nimport type { MentionExtensionConfiguration } from '../models/mention-extension-configuration';\nimport { createTiptapEditor } from './models/create-tiptap-editor';\nimport { EditorConfiguration } from '../models/editor-configuration';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-rich-text-editor': RichTextEditor;\n }\n}\n\n/**\n * A nimble styled rich text editor\n */\nexport class RichTextEditor extends mixinErrorPattern(RichText) {\n /**\n * @internal\n */\n public editorDiv = this.createEditor();\n\n /**\n * @internal\n */\n public tiptapEditor = createTiptapEditor(\n () => {},\n () => {},\n this.editorDiv,\n [],\n this.mentionListbox,\n this.placeholder\n );\n\n /**\n * @internal\n */\n public readonly xmlSerializer = new XMLSerializer();\n\n /**\n * @internal\n */\n public richTextMarkdownSerializer = new RichTextMarkdownSerializer([]);\n\n /**\n * Whether to disable user from editing and interacting with toolbar buttons\n *\n * @public\n * HTML Attribute: disabled\n */\n @attr({ mode: 'boolean' })\n public disabled = false;\n\n /**\n * Whether to hide the footer of the rich text editor\n *\n * @public\n * HTML Attribute: footer-hidden\n */\n @attr({ attribute: 'footer-hidden', mode: 'boolean' })\n public footerHidden = false;\n\n /**\n * @public\n * HTML Attribute: placeholder\n */\n @attr\n public placeholder?: string;\n\n /**\n * True if the editor is empty or contains only whitespace, false otherwise.\n *\n * @public\n */\n public get empty(): boolean {\n // Tiptap [isEmpty](https://tiptap.dev/api/editor#is-empty) returns false even if the editor has only whitespace.\n // Get the prose mirror textContent of all the nodes with whitespace trimmed to see if it is empty\n // Mention nodes are formatted as empty text content, so if empty make sure there are no mention nodes remaining\n if (this.tiptapEditor.state.doc.textContent.trim() === '') {\n let hasMention = false;\n this.tiptapEditor.state.doc.descendants(node => {\n if (node.type.name.startsWith(mentionPluginPrefix)) {\n hasMention = true;\n }\n const continueDescent = hasMention === false;\n return continueDescent;\n });\n return !hasMention;\n }\n return false;\n }\n\n /**\n * @internal\n */\n public mentionListbox?: RichTextMentionListbox;\n\n /**\n * @internal\n */\n @observable\n public boldButton!: ToggleButton;\n\n /**\n * @internal\n */\n @observable\n public italicsButton!: ToggleButton;\n\n /**\n * @internal\n */\n @observable\n public bulletListButton!: ToggleButton;\n\n /**\n * @internal\n */\n @observable\n public numberedListButton!: ToggleButton;\n\n /**\n * The width of the vertical scrollbar, if displayed.\n * @internal\n */\n @observable\n public scrollbarWidth = -1;\n\n /**\n * @internal\n */\n @observable\n public activeMentionCharacter = '';\n\n /**\n * @internal\n */\n @observable\n public activeMappingConfigs?: MappingConfigs;\n\n /**\n * @internal\n */\n public activeMentionCommand?: SuggestionProps['command'];\n\n /**\n * @internal\n */\n public editorContainer!: HTMLDivElement;\n\n private resizeObserver?: ResizeObserver;\n private updateScrollbarWidthQueued = false;\n\n /**\n * @internal\n */\n public override connectedCallback(): void {\n super.connectedCallback();\n if (!this.editorDiv.isConnected) {\n this.editorContainer.append(this.editorDiv);\n }\n this.bindEditorTransactionEvent();\n this.bindEditorUpdateEvent();\n this.stopNativeInputEventPropagation();\n this.resizeObserver = new ResizeObserver(() => this.onResize());\n this.resizeObserver.observe(this);\n }\n\n /**\n * @internal\n */\n public override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.unbindEditorTransactionEvent();\n this.unbindEditorUpdateEvent();\n this.unbindNativeInputEvent();\n this.resizeObserver?.disconnect();\n }\n\n /**\n * @internal\n */\n public disabledChanged(): void {\n this.disableEditor();\n this.disableMentionViewElement();\n }\n\n /**\n * Update the placeholder text and view of the editor.\n * @internal\n */\n public placeholderChanged(_prev: unknown, _next: unknown): void {\n const placeholderExtension = this.getTipTapExtension(\n 'placeholder'\n ) as Extension<PlaceholderOptions>;\n placeholderExtension.options.placeholder = this.placeholder ?? '';\n this.tiptapEditor.view.dispatch(this.tiptapEditor.state.tr);\n\n this.queueUpdateScrollbarWidth();\n }\n\n /**\n * @internal\n */\n public ariaLabelChanged(_prev: unknown, _next: unknown): void {\n if (this.ariaLabel !== null && this.ariaLabel !== undefined) {\n this.editorDiv.setAttribute('aria-label', this.ariaLabel);\n } else {\n this.editorDiv.removeAttribute('aria-label');\n }\n }\n\n /**\n * @internal\n */\n public configurationChanged(\n prev: EditorConfiguration | undefined,\n next: EditorConfiguration\n ): void {\n const formatButtonsState = this.getButtonsState(this.tiptapEditor);\n const { from, to } = this.tiptapEditor.view.state.selection;\n if (this.isMentionExtensionConfigUnchanged(prev, next)) {\n this.setMarkdown(this.getMarkdown());\n } else {\n const mentionExtensionConfig = this.getMentionExtensionConfig();\n const currentStateMarkdown = this.getMarkdown();\n this.richTextMarkdownSerializer = new RichTextMarkdownSerializer(\n mentionExtensionConfig.map(config => config.name)\n );\n this.initializeEditor();\n this.setMarkdown(currentStateMarkdown);\n }\n this.tiptapEditor.commands.setTextSelection({ from, to });\n this.resetEditorButtonsState(formatButtonsState);\n this.setActiveMappingConfigs();\n }\n\n /**\n * @internal\n */\n public activeMentionCharacterChanged(): void {\n this.setActiveMappingConfigs();\n }\n\n /**\n * Toggle the bold mark and focus back to the editor\n * @internal\n */\n public boldButtonClick(): void {\n this.tiptapEditor.chain().focus().toggleBold().run();\n }\n\n /**\n * Toggle the bold mark and focus back to the editor\n * @internal\n */\n public boldButtonKeyDown(event: KeyboardEvent): boolean {\n if (this.keyActivatesButton(event)) {\n this.tiptapEditor.chain().focus().toggleBold().run();\n return false;\n }\n return true;\n }\n\n /**\n * Toggle the italics mark and focus back to the editor\n * @internal\n */\n public italicsButtonClick(): void {\n this.tiptapEditor.chain().focus().toggleItalic().run();\n }\n\n /**\n * Toggle the italics mark and focus back to the editor\n * @internal\n */\n public italicsButtonKeyDown(event: KeyboardEvent): boolean {\n if (this.keyActivatesButton(event)) {\n this.tiptapEditor.chain().focus().toggleItalic().run();\n return false;\n }\n return true;\n }\n\n /**\n * Toggle the unordered list node and focus back to the editor\n * @internal\n */\n public bulletListButtonClick(): void {\n this.tiptapEditor.chain().focus().toggleBulletList().run();\n }\n\n /**\n * Toggle the unordered list node and focus back to the editor\n * @internal\n */\n public bulletListButtonKeyDown(event: KeyboardEvent): boolean {\n if (this.keyActivatesButton(event)) {\n this.tiptapEditor.chain().focus().toggleBulletList().run();\n return false;\n }\n return true;\n }\n\n /**\n * Toggle the ordered list node and focus back to the editor\n * @internal\n */\n public numberedListButtonClick(): void {\n this.tiptapEditor.chain().focus().toggleOrderedList().run();\n }\n\n /**\n * Toggle the ordered list node and focus back to the editor\n * @internal\n */\n public numberedListButtonKeyDown(event: KeyboardEvent): boolean {\n if (this.keyActivatesButton(event)) {\n this.tiptapEditor.chain().focus().toggleOrderedList().run();\n return false;\n }\n return true;\n }\n\n /**\n * Inserts the mention character into the editor and focus back to the editor\n * @internal\n */\n public mentionButtonClick(character: string): void {\n this.tiptapEditor\n .chain()\n .insertContent(\n this.shouldInsertSpace() ? ` ${character}` : character\n )\n .focus()\n .run();\n }\n\n /**\n * This function load tip tap editor with provided markdown content by parsing into html\n * @public\n */\n public setMarkdown(markdown: string): void {\n const html = this.getHtmlContent(markdown);\n this.tiptapEditor.commands.setContent(html);\n this.disableMentionViewElement();\n }\n\n /**\n * This function returns markdown string by serializing tiptap editor document using prosemirror MarkdownSerializer\n * @public\n */\n public getMarkdown(): string {\n return this.richTextMarkdownSerializer.serializeDOMToMarkdown(\n this.tiptapEditor.state.doc\n );\n }\n\n /**\n * @internal\n */\n public stopEventPropagation(event: Event): boolean {\n // Don't bubble the 'change' event from the toggle button because\n // all the formatting button has its own 'toggle' event through 'click' and 'keydown'.\n event.stopPropagation();\n return false;\n }\n\n public getMentionedHrefs(): string[] {\n const mentionedHrefs = new Set<string>();\n this.tiptapEditor.state.doc.descendants(node => {\n if (node.type.name.startsWith(mentionPluginPrefix)) {\n mentionedHrefs.add(node.attrs.href as string);\n }\n });\n return Array.from(mentionedHrefs);\n }\n\n /**\n * @internal\n */\n public getMentionExtensionConfig(): MentionExtensionConfiguration[] {\n return this.configuration instanceof EditorConfiguration\n ? this.configuration.mentionExtensionConfig\n : [];\n }\n\n /**\n * @internal\n */\n public onMentionSelect(event: CustomEvent<MentionDetail>): void {\n if (this.activeMentionCommand) {\n this.activeMentionCommand({\n href: event.detail.href,\n label: event.detail.displayName\n });\n }\n }\n\n /**\n * @internal\n */\n public focusoutHandler(): void {\n if (!this.mentionListbox?.open) {\n return;\n }\n this.mentionListbox?.close();\n }\n\n public override createConfig(): void {\n this.validate();\n if (this.richTextValidator.isValid()) {\n if (\n this.richTextUpdateTracker.updateButtonLabel\n || this.richTextUpdateTracker.updateMappingConfigs\n || this.richTextUpdateTracker.updatePattern\n ) {\n this.configuration = new EditorConfiguration(\n this.mentionElements\n );\n }\n } else {\n this.configuration = undefined;\n }\n }\n\n private isMentionExtensionConfigUnchanged(\n prev: EditorConfiguration | undefined,\n next: EditorConfiguration | undefined\n ): boolean {\n const prevConfigCharacters = prev?.mentionExtensionConfig\n .map(config => config.character)\n .sort((a, b) => a.localeCompare(b))\n .toString();\n const nextConfigCharacters = next?.mentionExtensionConfig\n .map(config => config.character)\n .sort((a, b) => a.localeCompare(b))\n .toString();\n return prevConfigCharacters === nextConfigCharacters;\n }\n\n private createEditor(): HTMLDivElement {\n const editor = document.createElement('div');\n editor.className = 'editor';\n editor.setAttribute('aria-multiline', 'true');\n editor.setAttribute('role', 'textbox');\n editor.setAttribute('aria-disabled', 'false');\n return editor;\n }\n\n private initializeEditor(): void {\n this.unbindEditorTransactionEvent();\n this.unbindEditorUpdateEvent();\n this.unbindNativeInputEvent();\n this.tiptapEditor?.destroy();\n this.tiptapEditor = createTiptapEditor(\n character => {\n this.activeMentionCharacter = character;\n },\n command => {\n this.activeMentionCommand = command;\n },\n this.editorDiv,\n this.configuration instanceof EditorConfiguration\n ? this.configuration.mentionExtensionConfig\n : [],\n this.mentionListbox,\n this.placeholder\n );\n this.disableEditor();\n this.disableMentionViewElement();\n this.bindEditorTransactionEvent();\n this.bindEditorUpdateEvent();\n this.stopNativeInputEventPropagation();\n }\n\n /**\n * This function takes the Fragment from parseMarkdownToDOM function and return the serialized string using XMLSerializer\n */\n private getHtmlContent(markdown: string): string {\n const parseResult = RichTextMarkdownParser.parseMarkdownToDOM(\n markdown,\n this.configuration?.parserMentionConfig\n );\n return this.xmlSerializer.serializeToString(parseResult.fragment);\n }\n\n /**\n * Binding the \"transaction\" event to the editor allows continuous monitoring the events and updating the button state in response to\n * various actions such as mouse events, keyboard events, changes in the editor content etc,.\n * https://tiptap.dev/api/events#transaction\n */\n private bindEditorTransactionEvent(): void {\n this.tiptapEditor.on('transaction', () => {\n this.updateEditorButtonsState();\n });\n }\n\n private unbindEditorTransactionEvent(): void {\n this.tiptapEditor.off('transaction');\n }\n\n private updateEditorButtonsState(): void {\n if (!this.$fastController.isConnected) {\n return;\n }\n\n const { extensionManager, state } = this.tiptapEditor;\n const { extensions } = extensionManager;\n const { selection } = state;\n const parentList = findParentNode((node: { type: { name: string } }) => isList(node.type.name, extensions))(selection);\n\n this.boldButton.checked = this.tiptapEditor.isActive('bold');\n this.italicsButton.checked = this.tiptapEditor.isActive('italic');\n this.bulletListButton.checked = parentList?.node.type.name === TipTapNodeName.bulletList;\n this.numberedListButton.checked = parentList?.node.type.name === TipTapNodeName.numberedList;\n }\n\n private keyActivatesButton(event: KeyboardEvent): boolean {\n switch (event.key) {\n case keySpace:\n case keyEnter:\n return true;\n default:\n return false;\n }\n }\n\n private unbindEditorUpdateEvent(): void {\n this.tiptapEditor.off('update');\n }\n\n /**\n * input event is fired when there is a change in the content of the editor.\n *\n * https://tiptap.dev/api/events#update\n */\n private bindEditorUpdateEvent(): void {\n this.tiptapEditor.on('update', () => {\n this.$emit('input');\n this.queueUpdateScrollbarWidth();\n });\n }\n\n private disableEditor(): void {\n this.tiptapEditor.setEditable(!this.disabled);\n this.setEditorTabIndex();\n this.editorDiv.setAttribute(\n 'aria-disabled',\n this.disabled ? 'true' : 'false'\n );\n this.mentionListbox?.close();\n }\n\n private disableMentionViewElement(): void {\n this.tiptapEditor.state.doc.descendants((node, pos) => {\n if (node.type.name.startsWith(mentionPluginPrefix)) {\n const updatedAttrs = {\n ...node.attrs,\n disabled: this.disabled ? '' : null\n };\n const updatedNode = this.tiptapEditor.schema.node(\n node.type.name,\n updatedAttrs,\n node.content\n );\n const updatedTransaction = this.tiptapEditor.state.tr.replaceWith(\n pos,\n pos + node.nodeSize,\n updatedNode\n );\n this.tiptapEditor.view.dispatch(updatedTransaction);\n }\n return true;\n });\n }\n\n /**\n * Stopping the native input event propagation emitted by the contenteditable element in the Tiptap\n * since there is an issue (linked below) in ProseMirror where selecting the text and removing it\n * does not trigger the native HTMLElement input event. So using the \"update\" event emitted by the\n * Tiptap to capture it as an \"input\" customEvent in the rich text editor.\n *\n * Prose Mirror issue: https://discuss.prosemirror.net/t/how-to-handle-select-backspace-delete-cut-type-kind-of-events-handletextinput-or-handledomevents-input-doesnt-help/4844\n */\n private stopNativeInputEventPropagation(): void {\n this.tiptapEditor.view.dom.addEventListener('input', event => {\n event.stopPropagation();\n });\n }\n\n private unbindNativeInputEvent(): void {\n this.tiptapEditor.view.dom.removeEventListener('input', () => {});\n }\n\n private queueUpdateScrollbarWidth(): void {\n if (!this.$fastController.isConnected) {\n return;\n }\n if (!this.updateScrollbarWidthQueued) {\n this.updateScrollbarWidthQueued = true;\n DOM.queueUpdate(() => this.updateScrollbarWidth());\n }\n }\n\n private updateScrollbarWidth(): void {\n this.updateScrollbarWidthQueued = false;\n this.scrollbarWidth = this.tiptapEditor.view.dom.offsetWidth\n - this.tiptapEditor.view.dom.clientWidth;\n }\n\n private onResize(): void {\n this.scrollbarWidth = this.tiptapEditor.view.dom.offsetWidth\n - this.tiptapEditor.view.dom.clientWidth;\n }\n\n private getTipTapExtension(\n extensionName: string\n ): AnyExtension | undefined {\n return this.tiptapEditor.extensionManager.extensions.find(\n (extension: { name: string }) => extension.name === extensionName\n );\n }\n\n private setEditorTabIndex(): void {\n this.tiptapEditor.setOptions({\n editorProps: {\n attributes: {\n tabindex: this.disabled ? '-1' : '0'\n }\n }\n });\n }\n\n private setActiveMappingConfigs(): void {\n this.activeMappingConfigs = this.activeMentionCharacter\n ? this.getMentionExtensionConfigFromCharacter(\n this.activeMentionCharacter\n )?.mappingConfigs\n : undefined;\n }\n\n private shouldInsertSpace(): boolean {\n const { $anchor, $head } = this.tiptapEditor.view.state.selection;\n\n const isAtStartOfLine = $head.parentOffset === 0 || $anchor.parentOffset === 0;\n const nodeBeforeSelection = $anchor.pos < $head.pos ? $anchor.nodeBefore : $head.nodeBefore;\n const isHardBreakNode = nodeBeforeSelection?.type.name === HardBreak.name;\n const hasWhitespaceBeforeCurrentPosition = nodeBeforeSelection?.textContent.endsWith(' ');\n\n return (\n !isAtStartOfLine\n && !isHardBreakNode\n && !hasWhitespaceBeforeCurrentPosition\n );\n }\n\n private getMentionExtensionConfigFromCharacter(\n character: string\n ): MentionExtensionConfiguration | undefined {\n return this.getMentionExtensionConfig().find(\n config => config.character === character\n );\n }\n\n private resetEditorButtonsState(\n buttonsState: FormatButtonsState | undefined\n ): void {\n if (buttonsState?.bold && !this.tiptapEditor.isActive('bold')) {\n this.tiptapEditor.chain().focus().toggleBold().run();\n }\n if (buttonsState?.italics && !this.tiptapEditor.isActive('italic')) {\n this.tiptapEditor.chain().focus().toggleItalic().run();\n }\n }\n\n private getButtonsState(\n tiptapEditor: Editor\n ): FormatButtonsState | undefined {\n if (!this.$fastController.isConnected) {\n return undefined;\n }\n return {\n bold: tiptapEditor.isActive('bold'),\n italics: tiptapEditor.isActive('italic')\n };\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface RichTextEditor extends ARIAGlobalStatesAndProperties {}\napplyMixins(RichTextEditor, ARIAGlobalStatesAndProperties);\n\nconst nimbleRichTextEditor = RichTextEditor.compose({\n baseName: 'rich-text-editor',\n template,\n styles,\n shadowOptions: {\n delegatesFocus: true\n }\n});\n\nDesignSystem.getOrCreate()\n .withPrefix('nimble')\n .register(nimbleRichTextEditor());\nexport const richTextEditorTag = 'nimble-rich-text-editor';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/rich-text/editor/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { observable, attr, DOM } from '@ni/fast-element';\nimport {\n applyMixins,\n ARIAGlobalStatesAndProperties,\n DesignSystem\n} from '@ni/fast-foundation';\nimport { keyEnter, keySpace } from '@ni/fast-web-utilities';\nimport {\n findParentNode,\n isList,\n type AnyExtension,\n Editor\n} from '@tiptap/core';\n\nimport HardBreak from '@tiptap/extension-hard-break';\nimport type { SuggestionProps } from '@tiptap/suggestion';\nimport { template } from './template';\nimport { styles } from './styles';\nimport type { ToggleButton } from '../../toggle-button';\nimport {\n TipTapNodeName,\n mentionPluginPrefix,\n type MentionDetail,\n type FormatButtonsState\n} from './types';\nimport { mixinErrorPattern } from '../../patterns/error/types';\nimport { RichTextMarkdownParser } from '../models/markdown-parser';\nimport { RichTextMarkdownSerializer } from '../models/markdown-serializer';\nimport { RichText } from '../base';\nimport type { RichTextMentionListbox } from '../mention-listbox';\nimport type { MappingConfigs } from '../../rich-text-mention/base/types';\nimport type { MentionExtensionConfiguration } from '../models/mention-extension-configuration';\nimport { createTiptapEditor } from './models/create-tiptap-editor';\nimport { EditorConfiguration } from '../models/editor-configuration';\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nimble-rich-text-editor': RichTextEditor;\n }\n}\n\n/**\n * A nimble styled rich text editor\n */\nexport class RichTextEditor extends mixinErrorPattern(RichText) {\n /**\n * @internal\n */\n public editorDiv = this.createEditor();\n\n /**\n * @internal\n */\n public tiptapEditor = createTiptapEditor(\n () => {},\n () => {},\n this.editorDiv,\n [],\n this.mentionListbox,\n this.placeholder\n );\n\n /**\n * @internal\n */\n public readonly xmlSerializer = new XMLSerializer();\n\n /**\n * @internal\n */\n public richTextMarkdownSerializer = new RichTextMarkdownSerializer([]);\n\n /**\n * Whether to disable user from editing and interacting with toolbar buttons\n *\n * @public\n * HTML Attribute: disabled\n */\n @attr({ mode: 'boolean' })\n public disabled = false;\n\n /**\n * Whether to hide the footer of the rich text editor\n *\n * @public\n * HTML Attribute: footer-hidden\n */\n @attr({ attribute: 'footer-hidden', mode: 'boolean' })\n public footerHidden = false;\n\n /**\n * @public\n * HTML Attribute: placeholder\n */\n @attr\n public placeholder?: string;\n\n /**\n * True if the editor is empty or contains only whitespace, false otherwise.\n *\n * @public\n */\n public get empty(): boolean {\n // Tiptap [isEmpty](https://tiptap.dev/api/editor#is-empty) returns false even if the editor has only whitespace.\n // Get the prose mirror textContent of all the nodes with whitespace trimmed to see if it is empty\n // Mention nodes are formatted as empty text content, so if empty make sure there are no mention nodes remaining\n if (this.tiptapEditor.state.doc.textContent.trim() === '') {\n let hasMention = false;\n this.tiptapEditor.state.doc.descendants(node => {\n if (node.type.name.startsWith(mentionPluginPrefix)) {\n hasMention = true;\n }\n const continueDescent = hasMention === false;\n return continueDescent;\n });\n return !hasMention;\n }\n return false;\n }\n\n /**\n * @internal\n */\n public mentionListbox?: RichTextMentionListbox;\n\n /**\n * @internal\n */\n @observable\n public boldButton!: ToggleButton;\n\n /**\n * @internal\n */\n @observable\n public italicsButton!: ToggleButton;\n\n /**\n * @internal\n */\n @observable\n public bulletListButton!: ToggleButton;\n\n /**\n * @internal\n */\n @observable\n public numberedListButton!: ToggleButton;\n\n /**\n * The width of the vertical scrollbar, if displayed.\n * @internal\n */\n @observable\n public scrollbarWidth = -1;\n\n /**\n * @internal\n */\n @observable\n public activeMentionCharacter = '';\n\n /**\n * @internal\n */\n @observable\n public activeMappingConfigs?: MappingConfigs;\n\n /**\n * @internal\n */\n public activeMentionCommand?: SuggestionProps['command'];\n\n /**\n * @internal\n */\n public editorContainer!: HTMLDivElement;\n\n private resizeObserver?: ResizeObserver;\n private updateScrollbarWidthQueued = false;\n\n /**\n * @internal\n */\n public override connectedCallback(): void {\n super.connectedCallback();\n if (!this.editorDiv.isConnected) {\n this.editorContainer.append(this.editorDiv);\n }\n this.bindEditorTransactionEvent();\n this.bindEditorUpdateEvent();\n this.stopNativeInputEventPropagation();\n this.resizeObserver = new ResizeObserver(() => this.onResize());\n this.resizeObserver.observe(this);\n }\n\n /**\n * @internal\n */\n public override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.unbindEditorTransactionEvent();\n this.unbindEditorUpdateEvent();\n this.unbindNativeInputEvent();\n this.resizeObserver?.disconnect();\n }\n\n /**\n * @internal\n */\n public disabledChanged(): void {\n this.disableEditor();\n this.disableMentionViewElement();\n }\n\n /**\n * Update the placeholder text and view of the editor.\n * @internal\n */\n public placeholderChanged(_prev: unknown, _next: unknown): void {\n // In TipTap v3, extension options cannot be modified after initialization.\n // We need to reinitialize the editor with the new placeholder value.\n // This workaround will be updated once the upstream issue is resolved.\n // See: https://github.com/ni/nimble/issues/2752\n const currentContent = this.getMarkdown();\n const { from, to } = this.tiptapEditor.view.state.selection;\n\n this.initializeEditor(); // Destroys and recreates entire editor\n this.setMarkdown(currentContent);\n this.tiptapEditor.commands.setTextSelection({ from, to });\n }\n\n /**\n * @internal\n */\n public ariaLabelChanged(_prev: unknown, _next: unknown): void {\n if (this.ariaLabel !== null && this.ariaLabel !== undefined) {\n this.editorDiv.setAttribute('aria-label', this.ariaLabel);\n } else {\n this.editorDiv.removeAttribute('aria-label');\n }\n }\n\n /**\n * @internal\n */\n public configurationChanged(\n prev: EditorConfiguration | undefined,\n next: EditorConfiguration\n ): void {\n const formatButtonsState = this.getButtonsState(this.tiptapEditor);\n const { from, to } = this.tiptapEditor.view.state.selection;\n if (this.isMentionExtensionConfigUnchanged(prev, next)) {\n this.setMarkdown(this.getMarkdown());\n } else {\n const mentionExtensionConfig = this.getMentionExtensionConfig();\n const currentStateMarkdown = this.getMarkdown();\n this.richTextMarkdownSerializer = new RichTextMarkdownSerializer(\n mentionExtensionConfig.map(config => config.name)\n );\n this.initializeEditor();\n this.setMarkdown(currentStateMarkdown);\n }\n this.tiptapEditor.commands.setTextSelection({ from, to });\n this.resetEditorButtonsState(formatButtonsState);\n this.setActiveMappingConfigs();\n }\n\n /**\n * @internal\n */\n public activeMentionCharacterChanged(): void {\n this.setActiveMappingConfigs();\n }\n\n /**\n * Toggle the bold mark and focus back to the editor\n * @internal\n */\n public boldButtonClick(): void {\n this.tiptapEditor.chain().focus().toggleBold().run();\n }\n\n /**\n * Toggle the bold mark and focus back to the editor\n * @internal\n */\n public boldButtonKeyDown(event: KeyboardEvent): boolean {\n if (this.keyActivatesButton(event)) {\n this.tiptapEditor.chain().focus().toggleBold().run();\n return false;\n }\n return true;\n }\n\n /**\n * Toggle the italics mark and focus back to the editor\n * @internal\n */\n public italicsButtonClick(): void {\n this.tiptapEditor.chain().focus().toggleItalic().run();\n }\n\n /**\n * Toggle the italics mark and focus back to the editor\n * @internal\n */\n public italicsButtonKeyDown(event: KeyboardEvent): boolean {\n if (this.keyActivatesButton(event)) {\n this.tiptapEditor.chain().focus().toggleItalic().run();\n return false;\n }\n return true;\n }\n\n /**\n * Toggle the unordered list node and focus back to the editor\n * @internal\n */\n public bulletListButtonClick(): void {\n this.tiptapEditor.chain().focus().toggleBulletList().run();\n }\n\n /**\n * Toggle the unordered list node and focus back to the editor\n * @internal\n */\n public bulletListButtonKeyDown(event: KeyboardEvent): boolean {\n if (this.keyActivatesButton(event)) {\n this.tiptapEditor.chain().focus().toggleBulletList().run();\n return false;\n }\n return true;\n }\n\n /**\n * Toggle the ordered list node and focus back to the editor\n * @internal\n */\n public numberedListButtonClick(): void {\n this.tiptapEditor.chain().focus().toggleOrderedList().run();\n }\n\n /**\n * Toggle the ordered list node and focus back to the editor\n * @internal\n */\n public numberedListButtonKeyDown(event: KeyboardEvent): boolean {\n if (this.keyActivatesButton(event)) {\n this.tiptapEditor.chain().focus().toggleOrderedList().run();\n return false;\n }\n return true;\n }\n\n /**\n * Inserts the mention character into the editor and focus back to the editor\n * @internal\n */\n public mentionButtonClick(character: string): void {\n this.tiptapEditor\n .chain()\n .insertContent(\n this.shouldInsertSpace() ? ` ${character}` : character\n )\n .focus()\n .run();\n }\n\n /**\n * This function load tip tap editor with provided markdown content by parsing into html\n * @public\n */\n public setMarkdown(markdown: string): void {\n const html = this.getHtmlContent(markdown);\n this.tiptapEditor.commands.setContent(html, { emitUpdate: false });\n this.disableMentionViewElement();\n }\n\n /**\n * This function returns markdown string by serializing tiptap editor document using prosemirror MarkdownSerializer\n * @public\n */\n public getMarkdown(): string {\n return this.richTextMarkdownSerializer.serializeDOMToMarkdown(\n this.tiptapEditor.state.doc\n );\n }\n\n /**\n * @internal\n */\n public stopEventPropagation(event: Event): boolean {\n // Don't bubble the 'change' event from the toggle button because\n // all the formatting button has its own 'toggle' event through 'click' and 'keydown'.\n event.stopPropagation();\n return false;\n }\n\n public getMentionedHrefs(): string[] {\n const mentionedHrefs = new Set<string>();\n this.tiptapEditor.state.doc.descendants(node => {\n if (node.type.name.startsWith(mentionPluginPrefix)) {\n mentionedHrefs.add(node.attrs.href as string);\n }\n });\n return Array.from(mentionedHrefs);\n }\n\n /**\n * @internal\n */\n public getMentionExtensionConfig(): MentionExtensionConfiguration[] {\n return this.configuration instanceof EditorConfiguration\n ? this.configuration.mentionExtensionConfig\n : [];\n }\n\n /**\n * @internal\n */\n public onMentionSelect(event: CustomEvent<MentionDetail>): void {\n if (this.activeMentionCommand) {\n this.activeMentionCommand({\n href: event.detail.href,\n label: event.detail.displayName\n });\n }\n }\n\n /**\n * @internal\n */\n public focusoutHandler(): void {\n if (!this.mentionListbox?.open) {\n return;\n }\n this.mentionListbox?.close();\n }\n\n public override createConfig(): void {\n this.validate();\n if (this.richTextValidator.isValid()) {\n if (\n this.richTextUpdateTracker.updateButtonLabel\n || this.richTextUpdateTracker.updateMappingConfigs\n || this.richTextUpdateTracker.updatePattern\n ) {\n this.configuration = new EditorConfiguration(\n this.mentionElements\n );\n }\n } else {\n this.configuration = undefined;\n }\n }\n\n private isMentionExtensionConfigUnchanged(\n prev: EditorConfiguration | undefined,\n next: EditorConfiguration | undefined\n ): boolean {\n const prevConfigCharacters = prev?.mentionExtensionConfig\n .map(config => config.character)\n .sort((a, b) => a.localeCompare(b))\n .toString();\n const nextConfigCharacters = next?.mentionExtensionConfig\n .map(config => config.character)\n .sort((a, b) => a.localeCompare(b))\n .toString();\n return prevConfigCharacters === nextConfigCharacters;\n }\n\n private createEditor(): HTMLDivElement {\n const editor = document.createElement('div');\n editor.className = 'editor';\n editor.setAttribute('aria-multiline', 'true');\n editor.setAttribute('role', 'textbox');\n editor.setAttribute('aria-disabled', 'false');\n return editor;\n }\n\n private initializeEditor(): void {\n this.unbindEditorTransactionEvent();\n this.unbindEditorUpdateEvent();\n this.unbindNativeInputEvent();\n this.tiptapEditor?.destroy();\n this.tiptapEditor = createTiptapEditor(\n character => {\n this.activeMentionCharacter = character;\n },\n command => {\n this.activeMentionCommand = command;\n },\n this.editorDiv,\n this.configuration instanceof EditorConfiguration\n ? this.configuration.mentionExtensionConfig\n : [],\n this.mentionListbox,\n this.placeholder\n );\n this.disableEditor();\n this.disableMentionViewElement();\n this.bindEditorTransactionEvent();\n this.bindEditorUpdateEvent();\n this.stopNativeInputEventPropagation();\n }\n\n /**\n * This function takes the Fragment from parseMarkdownToDOM function and return the serialized string using XMLSerializer\n */\n private getHtmlContent(markdown: string): string {\n const parseResult = RichTextMarkdownParser.parseMarkdownToDOM(\n markdown,\n this.configuration?.parserMentionConfig\n );\n return this.xmlSerializer.serializeToString(parseResult.fragment);\n }\n\n /**\n * Binding the \"transaction\" event to the editor allows continuous monitoring the events and updating the button state in response to\n * various actions such as mouse events, keyboard events, changes in the editor content etc,.\n * https://tiptap.dev/api/events#transaction\n */\n private bindEditorTransactionEvent(): void {\n this.tiptapEditor.on('transaction', () => {\n this.updateEditorButtonsState();\n });\n }\n\n private unbindEditorTransactionEvent(): void {\n this.tiptapEditor.off('transaction');\n }\n\n private updateEditorButtonsState(): void {\n if (!this.$fastController.isConnected) {\n return;\n }\n\n const { extensionManager, state } = this.tiptapEditor;\n const { extensions } = extensionManager;\n const { selection } = state;\n const parentList = findParentNode((node: { type: { name: string } }) => isList(node.type.name, extensions))(selection);\n\n this.boldButton.checked = this.tiptapEditor.isActive('bold');\n this.italicsButton.checked = this.tiptapEditor.isActive('italic');\n this.bulletListButton.checked = parentList?.node.type.name === TipTapNodeName.bulletList;\n this.numberedListButton.checked = parentList?.node.type.name === TipTapNodeName.numberedList;\n }\n\n private keyActivatesButton(event: KeyboardEvent): boolean {\n switch (event.key) {\n case keySpace:\n case keyEnter:\n return true;\n default:\n return false;\n }\n }\n\n private unbindEditorUpdateEvent(): void {\n this.tiptapEditor.off('update');\n }\n\n /**\n * input event is fired when there is a change in the content of the editor.\n *\n * https://tiptap.dev/api/events#update\n */\n private bindEditorUpdateEvent(): void {\n this.tiptapEditor.on('update', () => {\n this.$emit('input');\n this.queueUpdateScrollbarWidth();\n });\n }\n\n private disableEditor(): void {\n this.tiptapEditor.setEditable(!this.disabled);\n this.setEditorTabIndex();\n this.editorDiv.setAttribute(\n 'aria-disabled',\n this.disabled ? 'true' : 'false'\n );\n this.mentionListbox?.close();\n }\n\n private disableMentionViewElement(): void {\n this.tiptapEditor.state.doc.descendants((node, pos) => {\n if (node.type.name.startsWith(mentionPluginPrefix)) {\n const updatedAttrs = {\n ...node.attrs,\n disabled: this.disabled ? '' : null\n };\n const updatedNode = this.tiptapEditor.schema.node(\n node.type.name,\n updatedAttrs,\n node.content\n );\n const updatedTransaction = this.tiptapEditor.state.tr.replaceWith(\n pos,\n pos + node.nodeSize,\n updatedNode\n );\n this.tiptapEditor.view.dispatch(updatedTransaction);\n }\n return true;\n });\n }\n\n /**\n * Stopping the native input event propagation emitted by the contenteditable element in the Tiptap\n * since there is an issue (linked below) in ProseMirror where selecting the text and removing it\n * does not trigger the native HTMLElement input event. So using the \"update\" event emitted by the\n * Tiptap to capture it as an \"input\" customEvent in the rich text editor.\n *\n * Prose Mirror issue: https://discuss.prosemirror.net/t/how-to-handle-select-backspace-delete-cut-type-kind-of-events-handletextinput-or-handledomevents-input-doesnt-help/4844\n */\n private stopNativeInputEventPropagation(): void {\n this.tiptapEditor.view.dom.addEventListener('input', event => {\n event.stopPropagation();\n });\n }\n\n private unbindNativeInputEvent(): void {\n this.tiptapEditor.view.dom.removeEventListener('input', () => {});\n }\n\n private queueUpdateScrollbarWidth(): void {\n if (!this.$fastController.isConnected) {\n return;\n }\n if (!this.updateScrollbarWidthQueued) {\n this.updateScrollbarWidthQueued = true;\n DOM.queueUpdate(() => this.updateScrollbarWidth());\n }\n }\n\n private updateScrollbarWidth(): void {\n this.updateScrollbarWidthQueued = false;\n this.scrollbarWidth = this.tiptapEditor.view.dom.offsetWidth\n - this.tiptapEditor.view.dom.clientWidth;\n }\n\n private onResize(): void {\n this.scrollbarWidth = this.tiptapEditor.view.dom.offsetWidth\n - this.tiptapEditor.view.dom.clientWidth;\n }\n\n private getTipTapExtension(\n extensionName: string\n ): AnyExtension | undefined {\n return this.tiptapEditor.extensionManager.extensions.find(\n (extension: { name: string }) => extension.name === extensionName\n );\n }\n\n private setEditorTabIndex(): void {\n this.tiptapEditor.setOptions({\n editorProps: {\n attributes: {\n tabindex: this.disabled ? '-1' : '0'\n }\n }\n });\n }\n\n private setActiveMappingConfigs(): void {\n this.activeMappingConfigs = this.activeMentionCharacter\n ? this.getMentionExtensionConfigFromCharacter(\n this.activeMentionCharacter\n )?.mappingConfigs\n : undefined;\n }\n\n private shouldInsertSpace(): boolean {\n const { $anchor, $head } = this.tiptapEditor.view.state.selection;\n\n const isAtStartOfLine = $head.parentOffset === 0 || $anchor.parentOffset === 0;\n const nodeBeforeSelection = $anchor.pos < $head.pos ? $anchor.nodeBefore : $head.nodeBefore;\n const isHardBreakNode = nodeBeforeSelection?.type.name === HardBreak.name;\n const hasWhitespaceBeforeCurrentPosition = nodeBeforeSelection?.textContent.endsWith(' ');\n\n return (\n !isAtStartOfLine\n && !isHardBreakNode\n && !hasWhitespaceBeforeCurrentPosition\n );\n }\n\n private getMentionExtensionConfigFromCharacter(\n character: string\n ): MentionExtensionConfiguration | undefined {\n return this.getMentionExtensionConfig().find(\n config => config.character === character\n );\n }\n\n private resetEditorButtonsState(\n buttonsState: FormatButtonsState | undefined\n ): void {\n if (buttonsState?.bold && !this.tiptapEditor.isActive('bold')) {\n this.tiptapEditor.chain().focus().toggleBold().run();\n }\n if (buttonsState?.italics && !this.tiptapEditor.isActive('italic')) {\n this.tiptapEditor.chain().focus().toggleItalic().run();\n }\n }\n\n private getButtonsState(\n tiptapEditor: Editor\n ): FormatButtonsState | undefined {\n if (!this.$fastController.isConnected) {\n return undefined;\n }\n return {\n bold: tiptapEditor.isActive('bold'),\n italics: tiptapEditor.isActive('italic')\n };\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface RichTextEditor extends ARIAGlobalStatesAndProperties {}\napplyMixins(RichTextEditor, ARIAGlobalStatesAndProperties);\n\nconst nimbleRichTextEditor = RichTextEditor.compose({\n baseName: 'rich-text-editor',\n template,\n styles,\n shadowOptions: {\n delegatesFocus: true\n }\n});\n\nDesignSystem.getOrCreate()\n .withPrefix('nimble')\n .register(nimbleRichTextEditor());\nexport const richTextEditorTag = 'nimble-rich-text-editor';\n"]}
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import { Editor, Mark, Node, mergeAttributes } from '@tiptap/core';
|
|
2
2
|
import Bold from '@tiptap/extension-bold';
|
|
3
|
-
import BulletList from '@tiptap/extension-bullet-list';
|
|
4
3
|
import Document from '@tiptap/extension-document';
|
|
5
4
|
import HardBreak from '@tiptap/extension-hard-break';
|
|
6
|
-
import History from '@tiptap/extension-history';
|
|
7
5
|
import Italic from '@tiptap/extension-italic';
|
|
8
6
|
import Link from '@tiptap/extension-link';
|
|
9
|
-
import ListItem from '@tiptap/extension-list
|
|
7
|
+
import { BulletList, ListItem, OrderedList } from '@tiptap/extension-list';
|
|
10
8
|
import Mention from '@tiptap/extension-mention';
|
|
11
|
-
import OrderedList from '@tiptap/extension-ordered-list';
|
|
12
9
|
import Paragraph from '@tiptap/extension-paragraph';
|
|
13
|
-
import Placeholder from '@tiptap/extension-placeholder';
|
|
14
10
|
import Text from '@tiptap/extension-text';
|
|
11
|
+
import { Placeholder, UndoRedo } from '@tiptap/extensions';
|
|
15
12
|
import { Slice, Fragment, Node as FragmentNode } from 'prosemirror-model';
|
|
16
13
|
import { PluginKey } from 'prosemirror-state';
|
|
17
14
|
import { keyEscape } from '@ni/fast-web-utilities';
|
|
@@ -52,7 +49,7 @@ export function createTiptapEditor(activeMentionCharacterEmitter, activeMentionC
|
|
|
52
49
|
ListItem,
|
|
53
50
|
Bold,
|
|
54
51
|
Italic,
|
|
55
|
-
|
|
52
|
+
UndoRedo,
|
|
56
53
|
Placeholder.configure({
|
|
57
54
|
placeholder,
|
|
58
55
|
showOnlyWhenEditable: false
|
|
@@ -103,8 +100,9 @@ function createCustomLinkExtension() {
|
|
|
103
100
|
];
|
|
104
101
|
},
|
|
105
102
|
// HTMLAttribute cannot be in camelCase as we want to match it with the name in Tiptap
|
|
103
|
+
renderHTML({
|
|
106
104
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
107
|
-
|
|
105
|
+
HTMLAttributes }) {
|
|
108
106
|
// The below 'a' tag should be replaced with 'nimble-anchor' once the below issue is fixed.
|
|
109
107
|
// https://github.com/ni/nimble/issues/1516
|
|
110
108
|
return ['a', HTMLAttributes];
|
|
@@ -142,8 +140,8 @@ function createCustomMentionExtension(config, activeMentionCharacterEmitter, act
|
|
|
142
140
|
return {
|
|
143
141
|
href: {
|
|
144
142
|
default: null,
|
|
145
|
-
parseHTML: element => element.getAttribute('mention-href'),
|
|
146
|
-
renderHTML: attributes => {
|
|
143
|
+
parseHTML: (element) => element.getAttribute('mention-href'),
|
|
144
|
+
renderHTML: (attributes) => {
|
|
147
145
|
return {
|
|
148
146
|
'mention-href': attributes.href
|
|
149
147
|
};
|
|
@@ -151,8 +149,8 @@ function createCustomMentionExtension(config, activeMentionCharacterEmitter, act
|
|
|
151
149
|
},
|
|
152
150
|
label: {
|
|
153
151
|
default: null,
|
|
154
|
-
parseHTML: element => element.getAttribute('mention-label'),
|
|
155
|
-
renderHTML: attributes => {
|
|
152
|
+
parseHTML: (element) => element.getAttribute('mention-label'),
|
|
153
|
+
renderHTML: (attributes) => {
|
|
156
154
|
return {
|
|
157
155
|
'mention-label': attributes.label
|
|
158
156
|
};
|
|
@@ -160,8 +158,8 @@ function createCustomMentionExtension(config, activeMentionCharacterEmitter, act
|
|
|
160
158
|
},
|
|
161
159
|
disabled: {
|
|
162
160
|
default: null,
|
|
163
|
-
parseHTML: element => element.getAttribute('disabled'),
|
|
164
|
-
renderHTML: attributes => {
|
|
161
|
+
parseHTML: (element) => element.getAttribute('disabled'),
|
|
162
|
+
renderHTML: (attributes) => {
|
|
165
163
|
return {
|
|
166
164
|
disabled: attributes.disabled
|
|
167
165
|
};
|
|
@@ -169,8 +167,9 @@ function createCustomMentionExtension(config, activeMentionCharacterEmitter, act
|
|
|
169
167
|
}
|
|
170
168
|
};
|
|
171
169
|
},
|
|
170
|
+
renderHTML({ node,
|
|
172
171
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
173
|
-
|
|
172
|
+
HTMLAttributes }) {
|
|
174
173
|
return [
|
|
175
174
|
config.viewElement,
|
|
176
175
|
mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-tiptap-editor.js","sourceRoot":"","sources":["../../../../../src/rich-text/editor/models/create-tiptap-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Editor, Mark, Node, mergeAttributes } from '@tiptap/core';\nimport Bold from '@tiptap/extension-bold';\nimport BulletList from '@tiptap/extension-bullet-list';\nimport Document from '@tiptap/extension-document';\nimport HardBreak from '@tiptap/extension-hard-break';\nimport History from '@tiptap/extension-history';\nimport Italic from '@tiptap/extension-italic';\nimport Link from '@tiptap/extension-link';\nimport ListItem from '@tiptap/extension-list-item';\nimport Mention from '@tiptap/extension-mention';\nimport OrderedList from '@tiptap/extension-ordered-list';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Text from '@tiptap/extension-text';\nimport { Slice, Fragment, Node as FragmentNode } from 'prosemirror-model';\nimport { PluginKey } from 'prosemirror-state';\n\nimport { keyEscape } from '@ni/fast-web-utilities';\nimport {\n type ActiveMentionCommandEmitter,\n type ActiveMentionCharacterEmitter,\n mentionPluginPrefix\n} from '../types';\n\nimport { anchorTag } from '../../../anchor';\nimport type { MentionExtensionConfiguration } from '../../models/mention-extension-configuration';\nimport type { RichTextMentionListbox } from '../../mention-listbox';\n\nconst validAbsoluteLinkRegex = /^https?:\\/\\//i;\n\nexport function createTiptapEditor(\n activeMentionCharacterEmitter: ActiveMentionCharacterEmitter,\n activeMentionCommandEmitter: ActiveMentionCommandEmitter,\n editor: HTMLDivElement,\n mentionExtensionConfig: MentionExtensionConfiguration[],\n mentionListbox?: RichTextMentionListbox,\n placeholder?: string\n): Editor {\n const customLink = createCustomLinkExtension();\n const mentionExtensions = mentionExtensionConfig.map(config => createCustomMentionExtension(\n config,\n activeMentionCharacterEmitter,\n activeMentionCommandEmitter,\n mentionListbox\n ));\n\n /**\n * For more information on the extensions for the supported formatting options, refer to the links below.\n * Tiptap marks: https://tiptap.dev/api/marks\n * Tiptap nodes: https://tiptap.dev/api/nodes\n */\n const tipTapEditor = new Editor({\n element: editor,\n // The editor will detect markdown syntax for an input only for these items\n // https://tiptap.dev/api/editor#enable-input-rules\n enableInputRules: [BulletList, OrderedList],\n // The editor will not detect markdown syntax when pasting content in any supported items\n // Lists do not have any default paste rules, they have only input rules, so disabled paste rules\n // https://tiptap.dev/api/editor#enable-paste-rules\n enablePasteRules: false,\n editorProps: {\n // Validating whether the links in the pasted content belongs to the supported scheme (HTTPS/HTTP),\n // and rendering it as a link in the editor. If not, rendering it as a plain text.\n // Also, updating the link text content with its href as we support only the absolute link.\n\n // `transformPasted` can be updated/removed when hyperlink support added\n // See: https://github.com/ni/nimble/issues/1527\n transformPasted\n },\n extensions: [\n Document,\n Paragraph,\n Text,\n BulletList,\n OrderedList,\n ListItem,\n Bold,\n Italic,\n History,\n Placeholder.configure({\n placeholder,\n showOnlyWhenEditable: false\n }),\n HardBreak,\n customLink,\n ...mentionExtensions\n ]\n });\n\n /**\n * @param slice contains the Fragment of the copied content. If the content is a link, the slice contains Text node with Link mark.\n * ProseMirror reference for `transformPasted`: https://prosemirror.net/docs/ref/#view.EditorProps.transformPasted\n */\n function transformPasted(slice: Slice): Slice {\n const modifiedFragment = updateLinkAndMentionNodes(\n tipTapEditor,\n slice.content\n );\n return new Slice(modifiedFragment, slice.openStart, slice.openEnd);\n }\n\n return tipTapEditor;\n}\n\n/**\n * Extending the default link mark schema defined in the TipTap.\n *\n * \"excludes\": https://prosemirror.net/docs/ref/#model.MarkSpec.excludes\n * \"inclusive\": https://prosemirror.net/docs/ref/#model.MarkSpec.inclusive\n * \"parseHTML\": https://tiptap.dev/guide/custom-extensions#parse-html\n * \"renderHTML\": https://tiptap.dev/guide/custom-extensions/#render-html\n */\nfunction createCustomLinkExtension(): Mark {\n return Link.extend({\n // Excludes can be removed/enabled when hyperlink support added\n // See: https://github.com/ni/nimble/issues/1527\n excludes: '_',\n // Inclusive can be updated when hyperlink support added\n // See: https://github.com/ni/nimble/issues/1527\n inclusive: false,\n parseHTML() {\n return [\n // To load the `nimble-anchor` from the HTML parsed content by markdown-parser as links in the Tiptap editor, the `parseHTML`\n // of Link extension should return nimble `anchorTag`.\n // This is because the link mark schema in `markdown-parser.ts` file uses `<nimble-anchor>` as anchor tag and not `<a>`.\n {\n tag: anchorTag\n },\n // `<a>` tag is added here to support when pasting a link from external source.\n {\n tag: 'a'\n }\n ];\n },\n // HTMLAttribute cannot be in camelCase as we want to match it with the name in Tiptap\n // eslint-disable-next-line @typescript-eslint/naming-convention\n renderHTML({ HTMLAttributes }) {\n // The below 'a' tag should be replaced with 'nimble-anchor' once the below issue is fixed.\n // https://github.com/ni/nimble/issues/1516\n return ['a', HTMLAttributes];\n }\n }).configure({\n // HTMLAttribute cannot be in camelCase as we want to match it with the name in Tiptap\n // eslint-disable-next-line @typescript-eslint/naming-convention\n HTMLAttributes: {\n rel: 'noopener noreferrer',\n target: null,\n // Adding `class` here is a workaround to render two mentions without a whitespace as display names\n // This attribute can be removed when the below issue is resolved\n // https://github.com/ni/nimble/issues/1707\n class: ''\n },\n autolink: true,\n openOnClick: false,\n // linkOnPaste can be enabled when hyperlink support added\n // See: https://github.com/ni/nimble/issues/1527\n linkOnPaste: false,\n shouldAutoLink: href => validAbsoluteLinkRegex.test(href)\n });\n}\n\nfunction createCustomMentionExtension(\n config: MentionExtensionConfiguration,\n activeMentionCharacterEmitter: ActiveMentionCharacterEmitter,\n activeMentionCommandEmitter: ActiveMentionCommandEmitter,\n mentionListbox?: RichTextMentionListbox\n): Node {\n return Mention.extend({\n name: config.name,\n parseHTML() {\n return [\n {\n tag: config.viewElement\n }\n ];\n },\n addAttributes() {\n return {\n href: {\n default: null,\n parseHTML: element => element.getAttribute('mention-href'),\n renderHTML: attributes => {\n return {\n 'mention-href': attributes.href as string\n };\n }\n },\n label: {\n default: null,\n parseHTML: element => element.getAttribute('mention-label'),\n renderHTML: attributes => {\n return {\n 'mention-label': attributes.label as string\n };\n }\n },\n disabled: {\n default: null,\n parseHTML: element => element.getAttribute('disabled'),\n renderHTML: attributes => {\n return {\n disabled: attributes.disabled as string\n };\n }\n }\n };\n },\n // eslint-disable-next-line @typescript-eslint/naming-convention\n renderHTML({ node, HTMLAttributes }) {\n return [\n config.viewElement,\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n this.options.renderText({\n options: this.options,\n node,\n suggestion: null\n })\n ];\n }\n }).configure({\n suggestion: {\n char: config.character,\n decorationClass: 'nimble-mention-view-edit',\n pluginKey: new PluginKey(config.key),\n allowSpaces: true,\n render: () => {\n let inSuggestionMode = false;\n return {\n onStart: (props): void => {\n /**\n * If the cursor position moves to outside of the mention and configuration element changes,\n * the setMarkdown() will trigger this `onStart` without a decoration node because the cursor\n * position is temporarily moved out of the suggestion decoration. Ignore `onStart` in that case\n * and don't show the mention list box since it doesn't have anything to anchor to.\n */\n if (props.decorationNode === null) {\n return;\n }\n inSuggestionMode = true;\n config.mentionUpdateEmitter(props.query);\n activeMentionCharacterEmitter(props.text.slice(0, 1));\n activeMentionCommandEmitter(props.command);\n mentionListbox?.show({\n filter: props.query,\n anchorNode: props.decorationNode as HTMLElement\n });\n },\n onUpdate: (props): void => {\n if (!inSuggestionMode) {\n return;\n }\n config.mentionUpdateEmitter(props.query);\n activeMentionCommandEmitter(props.command);\n mentionListbox?.show({\n filter: props.query,\n anchorNode: props.decorationNode as HTMLElement\n });\n },\n onKeyDown: (props): boolean => {\n if (!inSuggestionMode) {\n return false;\n }\n if (props.event.key === keyEscape) {\n inSuggestionMode = false;\n }\n return (\n mentionListbox?.keydownHandler(props.event) ?? false\n );\n },\n onExit: (): void => {\n activeMentionCharacterEmitter('');\n activeMentionCommandEmitter(undefined);\n mentionListbox?.close();\n }\n };\n }\n }\n });\n}\n\n/**\n * This method finds the Link mark in the pasted content and update its Text node.\n * If there is no text node, pass the node's fragment recursively and updates only node containing Link mark.\n * If the Text node does not contains Link mark, push the same node to `updatedNodes`.\n *\n * @param fragment Fragment containing the pasted content. [Fragment](https://prosemirror.net/docs/ref/#model.Fragment)\n * @returns modified fragment from the `updatedNode` after updating the valid link text with its href value.\n */\nfunction updateLinkAndMentionNodes(\n tiptapEditor: Editor,\n fragment: Fragment\n): Fragment {\n const updatedNodes: FragmentNode[] = [];\n\n fragment.forEach(node => {\n if (node.isText && node.marks.length > 0) {\n const linkMark = node.marks.find(\n mark => mark.type.name === 'link' && mark.attrs\n );\n if (linkMark) {\n // Checks if the link is valid link or not\n // Needing to separately validate the link on paste is a workaround for a tiptap issue\n // See: https://github.com/ni/nimble/issues/1527\n if (\n validAbsoluteLinkRegex.test(linkMark.attrs.href as string)\n ) {\n // The below lines of code is responsible for updating the text content with its href value and creates a new updated text node.\n // This code needs an update when the hyperlink support is added.\n // See: https://github.com/ni/nimble/issues/1527\n updatedNodes.push(\n tiptapEditor.schema.text(\n linkMark.attrs.href as string,\n node.marks\n )\n );\n } else {\n // If it is a invalid link, creates a new Text node with the same text content and without a Link mark.\n updatedNodes.push(\n tiptapEditor.schema.text(\n node.textContent,\n linkMark.removeFromSet(node.marks)\n )\n );\n }\n } else {\n updatedNodes.push(node);\n }\n } else if (node.type.name.startsWith(mentionPluginPrefix)) {\n updatedNodes.push(\n tiptapEditor.schema.text(node.attrs.label as string)\n );\n } else {\n const updatedContent = updateLinkAndMentionNodes(\n tiptapEditor,\n node.content\n );\n updatedNodes.push(node.copy(updatedContent));\n }\n });\n\n return Fragment.fromArray(updatedNodes);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"create-tiptap-editor.js","sourceRoot":"","sources":["../../../../../src/rich-text/editor/models/create-tiptap-editor.ts"],"names":[],"mappings":"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","sourcesContent":["import { Editor, Mark, Node, mergeAttributes } from '@tiptap/core';\nimport Bold from '@tiptap/extension-bold';\nimport Document from '@tiptap/extension-document';\nimport HardBreak from '@tiptap/extension-hard-break';\nimport Italic from '@tiptap/extension-italic';\nimport Link from '@tiptap/extension-link';\nimport { BulletList, ListItem, OrderedList } from '@tiptap/extension-list';\nimport Mention from '@tiptap/extension-mention';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport Text from '@tiptap/extension-text';\nimport { Placeholder, UndoRedo } from '@tiptap/extensions';\nimport { Slice, Fragment, Node as FragmentNode } from 'prosemirror-model';\nimport { PluginKey } from 'prosemirror-state';\n\nimport { keyEscape } from '@ni/fast-web-utilities';\nimport {\n type ActiveMentionCommandEmitter,\n type ActiveMentionCharacterEmitter,\n mentionPluginPrefix\n} from '../types';\n\nimport { anchorTag } from '../../../anchor';\nimport type { MentionExtensionConfiguration } from '../../models/mention-extension-configuration';\nimport type { RichTextMentionListbox } from '../../mention-listbox';\n\nconst validAbsoluteLinkRegex = /^https?:\\/\\//i;\n\nexport function createTiptapEditor(\n activeMentionCharacterEmitter: ActiveMentionCharacterEmitter,\n activeMentionCommandEmitter: ActiveMentionCommandEmitter,\n editor: HTMLDivElement,\n mentionExtensionConfig: MentionExtensionConfiguration[],\n mentionListbox?: RichTextMentionListbox,\n placeholder?: string\n): Editor {\n const customLink = createCustomLinkExtension();\n const mentionExtensions = mentionExtensionConfig.map(config => createCustomMentionExtension(\n config,\n activeMentionCharacterEmitter,\n activeMentionCommandEmitter,\n mentionListbox\n ));\n\n /**\n * For more information on the extensions for the supported formatting options, refer to the links below.\n * Tiptap marks: https://tiptap.dev/api/marks\n * Tiptap nodes: https://tiptap.dev/api/nodes\n */\n const tipTapEditor = new Editor({\n element: editor,\n // The editor will detect markdown syntax for an input only for these items\n // https://tiptap.dev/api/editor#enable-input-rules\n enableInputRules: [BulletList, OrderedList],\n // The editor will not detect markdown syntax when pasting content in any supported items\n // Lists do not have any default paste rules, they have only input rules, so disabled paste rules\n // https://tiptap.dev/api/editor#enable-paste-rules\n enablePasteRules: false,\n editorProps: {\n // Validating whether the links in the pasted content belongs to the supported scheme (HTTPS/HTTP),\n // and rendering it as a link in the editor. If not, rendering it as a plain text.\n // Also, updating the link text content with its href as we support only the absolute link.\n\n // `transformPasted` can be updated/removed when hyperlink support added\n // See: https://github.com/ni/nimble/issues/1527\n transformPasted\n },\n extensions: [\n Document,\n Paragraph,\n Text,\n BulletList,\n OrderedList,\n ListItem,\n Bold,\n Italic,\n UndoRedo,\n Placeholder.configure({\n placeholder,\n showOnlyWhenEditable: false\n }),\n HardBreak,\n customLink,\n ...mentionExtensions\n ]\n });\n\n /**\n * @param slice contains the Fragment of the copied content. If the content is a link, the slice contains Text node with Link mark.\n * ProseMirror reference for `transformPasted`: https://prosemirror.net/docs/ref/#view.EditorProps.transformPasted\n */\n function transformPasted(slice: Slice): Slice {\n const modifiedFragment = updateLinkAndMentionNodes(\n tipTapEditor,\n slice.content\n );\n return new Slice(modifiedFragment, slice.openStart, slice.openEnd);\n }\n\n return tipTapEditor;\n}\n\n/**\n * Extending the default link mark schema defined in the TipTap.\n *\n * \"excludes\": https://prosemirror.net/docs/ref/#model.MarkSpec.excludes\n * \"inclusive\": https://prosemirror.net/docs/ref/#model.MarkSpec.inclusive\n * \"parseHTML\": https://tiptap.dev/guide/custom-extensions#parse-html\n * \"renderHTML\": https://tiptap.dev/guide/custom-extensions/#render-html\n */\nfunction createCustomLinkExtension(): Mark {\n return Link.extend({\n // Excludes can be removed/enabled when hyperlink support added\n // See: https://github.com/ni/nimble/issues/1527\n excludes: '_',\n // Inclusive can be updated when hyperlink support added\n // See: https://github.com/ni/nimble/issues/1527\n inclusive: false,\n parseHTML() {\n return [\n // To load the `nimble-anchor` from the HTML parsed content by markdown-parser as links in the Tiptap editor, the `parseHTML`\n // of Link extension should return nimble `anchorTag`.\n // This is because the link mark schema in `markdown-parser.ts` file uses `<nimble-anchor>` as anchor tag and not `<a>`.\n {\n tag: anchorTag\n },\n // `<a>` tag is added here to support when pasting a link from external source.\n {\n tag: 'a'\n }\n ];\n },\n // HTMLAttribute cannot be in camelCase as we want to match it with the name in Tiptap\n renderHTML({\n // eslint-disable-next-line @typescript-eslint/naming-convention\n HTMLAttributes\n }: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n HTMLAttributes: { [key: string]: string }\n }) {\n // The below 'a' tag should be replaced with 'nimble-anchor' once the below issue is fixed.\n // https://github.com/ni/nimble/issues/1516\n return ['a', HTMLAttributes];\n }\n }).configure({\n // HTMLAttribute cannot be in camelCase as we want to match it with the name in Tiptap\n // eslint-disable-next-line @typescript-eslint/naming-convention\n HTMLAttributes: {\n rel: 'noopener noreferrer',\n target: null,\n // Adding `class` here is a workaround to render two mentions without a whitespace as display names\n // This attribute can be removed when the below issue is resolved\n // https://github.com/ni/nimble/issues/1707\n class: ''\n },\n autolink: true,\n openOnClick: false,\n // linkOnPaste can be enabled when hyperlink support added\n // See: https://github.com/ni/nimble/issues/1527\n linkOnPaste: false,\n shouldAutoLink: href => validAbsoluteLinkRegex.test(href)\n });\n}\n\nfunction createCustomMentionExtension(\n config: MentionExtensionConfiguration,\n activeMentionCharacterEmitter: ActiveMentionCharacterEmitter,\n activeMentionCommandEmitter: ActiveMentionCommandEmitter,\n mentionListbox?: RichTextMentionListbox\n): Node {\n return Mention.extend({\n name: config.name,\n parseHTML() {\n return [\n {\n tag: config.viewElement\n }\n ];\n },\n addAttributes() {\n return {\n href: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute('mention-href'),\n renderHTML: (attributes: { [key: string]: string }) => {\n return {\n 'mention-href': attributes.href\n };\n }\n },\n label: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute('mention-label'),\n renderHTML: (attributes: { [key: string]: string }) => {\n return {\n 'mention-label': attributes.label\n };\n }\n },\n disabled: {\n default: null,\n parseHTML: (element: HTMLElement) => element.getAttribute('disabled'),\n renderHTML: (attributes: { [key: string]: string }) => {\n return {\n disabled: attributes.disabled\n };\n }\n }\n };\n },\n renderHTML({\n node,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n HTMLAttributes\n }: {\n node: FragmentNode,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n HTMLAttributes: { [key: string]: string }\n }) {\n return [\n config.viewElement,\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n this.options.renderText({\n options: this.options,\n node,\n suggestion: null\n })\n ];\n }\n }).configure({\n suggestion: {\n char: config.character,\n decorationClass: 'nimble-mention-view-edit',\n pluginKey: new PluginKey(config.key),\n allowSpaces: true,\n render: () => {\n let inSuggestionMode = false;\n return {\n onStart: (props): void => {\n /**\n * If the cursor position moves to outside of the mention and configuration element changes,\n * the setMarkdown() will trigger this `onStart` without a decoration node because the cursor\n * position is temporarily moved out of the suggestion decoration. Ignore `onStart` in that case\n * and don't show the mention list box since it doesn't have anything to anchor to.\n */\n if (props.decorationNode === null) {\n return;\n }\n inSuggestionMode = true;\n config.mentionUpdateEmitter(props.query);\n activeMentionCharacterEmitter(props.text.slice(0, 1));\n activeMentionCommandEmitter(props.command);\n mentionListbox?.show({\n filter: props.query,\n anchorNode: props.decorationNode as HTMLElement\n });\n },\n onUpdate: (props): void => {\n if (!inSuggestionMode) {\n return;\n }\n config.mentionUpdateEmitter(props.query);\n activeMentionCommandEmitter(props.command);\n mentionListbox?.show({\n filter: props.query,\n anchorNode: props.decorationNode as HTMLElement\n });\n },\n onKeyDown: (props): boolean => {\n if (!inSuggestionMode) {\n return false;\n }\n if (props.event.key === keyEscape) {\n inSuggestionMode = false;\n }\n return (\n mentionListbox?.keydownHandler(props.event) ?? false\n );\n },\n onExit: (): void => {\n activeMentionCharacterEmitter('');\n activeMentionCommandEmitter(undefined);\n mentionListbox?.close();\n }\n };\n }\n }\n });\n}\n\n/**\n * This method finds the Link mark in the pasted content and update its Text node.\n * If there is no text node, pass the node's fragment recursively and updates only node containing Link mark.\n * If the Text node does not contains Link mark, push the same node to `updatedNodes`.\n *\n * @param fragment Fragment containing the pasted content. [Fragment](https://prosemirror.net/docs/ref/#model.Fragment)\n * @returns modified fragment from the `updatedNode` after updating the valid link text with its href value.\n */\nfunction updateLinkAndMentionNodes(\n tiptapEditor: Editor,\n fragment: Fragment\n): Fragment {\n const updatedNodes: FragmentNode[] = [];\n\n fragment.forEach(node => {\n if (node.isText && node.marks.length > 0) {\n const linkMark = node.marks.find(\n mark => mark.type.name === 'link' && mark.attrs\n );\n if (linkMark) {\n // Checks if the link is valid link or not\n // Needing to separately validate the link on paste is a workaround for a tiptap issue\n // See: https://github.com/ni/nimble/issues/1527\n if (\n validAbsoluteLinkRegex.test(linkMark.attrs.href as string)\n ) {\n // The below lines of code is responsible for updating the text content with its href value and creates a new updated text node.\n // This code needs an update when the hyperlink support is added.\n // See: https://github.com/ni/nimble/issues/1527\n updatedNodes.push(\n tiptapEditor.schema.text(\n linkMark.attrs.href as string,\n node.marks\n )\n );\n } else {\n // If it is a invalid link, creates a new Text node with the same text content and without a Link mark.\n updatedNodes.push(\n tiptapEditor.schema.text(\n node.textContent,\n linkMark.removeFromSet(node.marks)\n )\n );\n }\n } else {\n updatedNodes.push(node);\n }\n } else if (node.type.name.startsWith(mentionPluginPrefix)) {\n updatedNodes.push(\n tiptapEditor.schema.text(node.attrs.label as string)\n );\n } else {\n const updatedContent = updateLinkAndMentionNodes(\n tiptapEditor,\n node.content\n );\n updatedNodes.push(node.copy(updatedContent));\n }\n });\n\n return Fragment.fromArray(updatedNodes);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ni/nimble-components",
|
|
3
|
-
"version": "34.
|
|
3
|
+
"version": "34.6.1",
|
|
4
4
|
"description": "Styled web components for the NI Nimble Design System",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "npm run generate-icons && npm run generate-workers && npm run build-components && npm run bundle-components && npm run generate-scss",
|
|
@@ -67,20 +67,18 @@
|
|
|
67
67
|
"@ni/nimble-tokens": "^8.13.2",
|
|
68
68
|
"@tanstack/table-core": "^8.19.3",
|
|
69
69
|
"@tanstack/virtual-core": "^3.10.6",
|
|
70
|
-
"@tiptap/core": "^
|
|
71
|
-
"@tiptap/extension-bold": "^
|
|
72
|
-
"@tiptap/extension-
|
|
73
|
-
"@tiptap/extension-
|
|
74
|
-
"@tiptap/extension-
|
|
75
|
-
"@tiptap/extension-
|
|
76
|
-
"@tiptap/extension-
|
|
77
|
-
"@tiptap/extension-
|
|
78
|
-
"@tiptap/extension-
|
|
79
|
-
"@tiptap/extension-
|
|
80
|
-
"@tiptap/
|
|
81
|
-
"@tiptap/
|
|
82
|
-
"@tiptap/extension-placeholder": "^2.25.1",
|
|
83
|
-
"@tiptap/extension-text": "^2.25.1",
|
|
70
|
+
"@tiptap/core": "^3.10.1",
|
|
71
|
+
"@tiptap/extension-bold": "^3.10.1",
|
|
72
|
+
"@tiptap/extension-document": "^3.10.1",
|
|
73
|
+
"@tiptap/extension-hard-break": "^3.10.1",
|
|
74
|
+
"@tiptap/extension-italic": "^3.10.1",
|
|
75
|
+
"@tiptap/extension-link": "^3.10.1",
|
|
76
|
+
"@tiptap/extension-list": "^3.10.1",
|
|
77
|
+
"@tiptap/extension-mention": "^3.10.1",
|
|
78
|
+
"@tiptap/extension-paragraph": "^3.10.1",
|
|
79
|
+
"@tiptap/extension-text": "^3.10.1",
|
|
80
|
+
"@tiptap/extensions": "^3.10.1",
|
|
81
|
+
"@tiptap/suggestion": "^3.10.1",
|
|
84
82
|
"@types/d3-array": "^3.0.4",
|
|
85
83
|
"@types/d3-random": "^3.0.1",
|
|
86
84
|
"@types/d3-scale": "^4.0.2",
|