@ni/nimble-components 35.1.2 → 35.2.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 +307 -254
- package/dist/all-components-bundle.js.map +1 -1
- package/dist/all-components-bundle.min.js +3904 -3882
- package/dist/all-components-bundle.min.js.map +1 -1
- package/dist/esm/all-components.d.ts +3 -0
- package/dist/esm/all-components.js +3 -0
- package/dist/esm/all-components.js.map +1 -1
- package/dist/esm/anchor/template.js +4 -4
- package/dist/esm/anchor/template.js.map +1 -1
- package/dist/esm/anchor-step/index.d.ts +12 -0
- package/dist/esm/anchor-step/index.js +16 -0
- package/dist/esm/anchor-step/index.js.map +1 -0
- package/dist/esm/anchor-step/styles.d.ts +1 -0
- package/dist/esm/anchor-step/styles.js +6 -0
- package/dist/esm/anchor-step/styles.js.map +1 -0
- package/dist/esm/anchor-step/template.d.ts +2 -0
- package/dist/esm/anchor-step/template.js +5 -0
- package/dist/esm/anchor-step/template.js.map +1 -0
- package/dist/esm/anchor-tabs/index.js +2 -0
- package/dist/esm/anchor-tabs/index.js.map +1 -1
- package/dist/esm/checkbox/template.js +3 -3
- package/dist/esm/checkbox/template.js.map +1 -1
- package/dist/esm/chip/testing/chip.pageobject.js +1 -1
- package/dist/esm/chip/testing/chip.pageobject.js.map +1 -1
- package/dist/esm/combobox/index.js +11 -11
- package/dist/esm/combobox/index.js.map +1 -1
- package/dist/esm/combobox/template.js +1 -1
- package/dist/esm/combobox/template.js.map +1 -1
- package/dist/esm/dialog/index.js +1 -1
- package/dist/esm/dialog/index.js.map +1 -1
- package/dist/esm/menu/menu.foundation.js +3 -3
- package/dist/esm/menu/menu.foundation.js.map +1 -1
- package/dist/esm/menu-button/index.js +2 -2
- package/dist/esm/menu-button/index.js.map +1 -1
- package/dist/esm/number-field/template.js +3 -3
- package/dist/esm/number-field/template.js.map +1 -1
- package/dist/esm/rich-text/editor/index.js +1 -1
- package/dist/esm/rich-text/editor/index.js.map +1 -1
- package/dist/esm/rich-text/editor/models/create-tiptap-editor.js +1 -1
- package/dist/esm/rich-text/editor/models/create-tiptap-editor.js.map +1 -1
- package/dist/esm/rich-text/editor/testing/rich-text-editor.pageobject.js +1 -3
- package/dist/esm/rich-text/editor/testing/rich-text-editor.pageobject.js.map +1 -1
- package/dist/esm/rich-text/mention-listbox/index.d.ts +1 -1
- package/dist/esm/rich-text/mention-listbox/index.js +3 -3
- package/dist/esm/rich-text/mention-listbox/index.js.map +1 -1
- package/dist/esm/rich-text/models/markdown-serializer.js +1 -1
- package/dist/esm/rich-text/models/markdown-serializer.js.map +1 -1
- package/dist/esm/rich-text/models/rich-text-validator.js +1 -1
- package/dist/esm/rich-text/models/rich-text-validator.js.map +1 -1
- package/dist/esm/select/index.js +11 -15
- package/dist/esm/select/index.js.map +1 -1
- package/dist/esm/select/template.js +1 -1
- package/dist/esm/select/template.js.map +1 -1
- package/dist/esm/step/index.d.ts +12 -0
- package/dist/esm/step/index.js +16 -0
- package/dist/esm/step/index.js.map +1 -0
- package/dist/esm/step/styles.d.ts +1 -0
- package/dist/esm/step/styles.js +6 -0
- package/dist/esm/step/styles.js.map +1 -0
- package/dist/esm/step/template.d.ts +2 -0
- package/dist/esm/step/template.js +5 -0
- package/dist/esm/step/template.js.map +1 -0
- package/dist/esm/stepper/index.d.ts +12 -0
- package/dist/esm/stepper/index.js +16 -0
- package/dist/esm/stepper/index.js.map +1 -0
- package/dist/esm/stepper/styles.d.ts +1 -0
- package/dist/esm/stepper/styles.js +6 -0
- package/dist/esm/stepper/styles.js.map +1 -0
- package/dist/esm/stepper/template.d.ts +2 -0
- package/dist/esm/stepper/template.js +5 -0
- package/dist/esm/stepper/template.js.map +1 -0
- package/dist/esm/switch/template.js +1 -1
- package/dist/esm/switch/template.js.map +1 -1
- package/dist/esm/table/index.js +1 -1
- package/dist/esm/table/index.js.map +1 -1
- package/dist/esm/table/models/array-to-tree.js +6 -10
- package/dist/esm/table/models/array-to-tree.js.map +1 -1
- package/dist/esm/table/models/keyboard-navigation-manager.js.map +1 -1
- package/dist/esm/table/models/selection-managers/selection-manager-base.js +1 -1
- package/dist/esm/table/models/selection-managers/selection-manager-base.js.map +1 -1
- package/dist/esm/table/models/table-layout-manager.js +1 -1
- package/dist/esm/table/models/table-layout-manager.js.map +1 -1
- package/dist/esm/table/models/table-validator.js +1 -1
- package/dist/esm/table/models/table-validator.js.map +1 -1
- package/dist/esm/table-column/duration-text/models/duration-formatter.js +2 -2
- package/dist/esm/table-column/duration-text/models/duration-formatter.js.map +1 -1
- package/dist/esm/text-area/template.js +1 -1
- package/dist/esm/text-area/template.js.map +1 -1
- package/dist/esm/text-field/template.js +1 -1
- package/dist/esm/text-field/template.js.map +1 -1
- package/dist/esm/utilities/models/tracker.js.map +1 -1
- package/dist/esm/wafer-map/experimental/worker-renderer.js +1 -2
- package/dist/esm/wafer-map/experimental/worker-renderer.js.map +1 -1
- package/dist/esm/wafer-map/modules/rendering.js +1 -1
- package/dist/esm/wafer-map/modules/rendering.js.map +1 -1
- package/dist/esm/wafer-map/modules/wafer-map-validator.js +1 -1
- package/dist/esm/wafer-map/modules/wafer-map-validator.js.map +1 -1
- package/dist/esm/wafer-map/workers/worker-code.d.ts +1 -1
- package/dist/esm/wafer-map/workers/worker-code.js +1 -1
- package/dist/esm/wafer-map/workers/worker-code.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/number-field/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EACH,eAAe,EAGf,iBAAiB,EACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,kCAAkC,EAAE,MAAM,uCAAuC,CAAC;AAE3F,MAAM,aAAa,GAAG,kCAAkC,CACpD,IAAI,CAAa;;;iBAGJ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;;
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/number-field/template.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, ref, slotted, when } from '@ni/fast-element';\nimport type { ViewTemplate } from '@ni/fast-element';\nimport {\n endSlotTemplate,\n type FoundationElementTemplate,\n type NumberFieldOptions,\n startSlotTemplate\n} from '@ni/fast-foundation';\nimport type { NumberField } from '.';\nimport { createRequiredVisibleLabelTemplate } from '../patterns/required-visible/template';\n\nconst labelTemplate = createRequiredVisibleLabelTemplate(\n html<NumberField>`<label\n part=\"label\"\n for=\"control\"\n class=\"${x => (x.defaultSlottedNodes?.length > 0 ? 'label' : 'label label__hidden')}\"\n >\n <slot ${slotted('defaultSlottedNodes')}></slot>\n </label>`\n);\n\n/**\n * The template for the {@link @ni/fast-foundation#(NumberField:class)} component.\n * @public\n */\nexport const template: FoundationElementTemplate<\nViewTemplate<NumberField>,\nNumberFieldOptions\n> = (context, definition) => html`\n <template class=\"${x => (x.readOnly ? 'readonly' : '')}\">\n ${labelTemplate}\n <div class=\"root\" part=\"root\">\n ${startSlotTemplate(context, definition)}\n <input\n class=\"control\"\n part=\"control\"\n id=\"control\"\n @input=\"${x => x.handleTextInput()}\"\n @change=\"${x => x.handleChange()}\"\n @keydown=\"${(x, c) => x.handleKeyDown(c.event as KeyboardEvent)}\"\n @blur=\"${x => x.handleBlur()}\"\n ?autofocus=\"${x => x.autofocus}\"\n ?disabled=\"${x => x.disabled}\"\n list=\"${x => x.list}\"\n maxlength=\"${x => x.maxlength}\"\n minlength=\"${x => x.minlength}\"\n placeholder=\"${x => x.placeholder}\"\n ?readonly=\"${x => x.readOnly}\"\n ?required=\"${x => x.required}\"\n size=\"${x => x.size}\"\n type=\"text\"\n inputmode=\"text\"\n min=\"${x => x.min}\"\n max=\"${x => x.max}\"\n step=\"${x => x.step}\"\n aria-atomic=\"${x => x.ariaAtomic}\"\n aria-busy=\"${x => x.ariaBusy}\"\n aria-controls=\"${x => x.ariaControls}\"\n aria-current=\"${x => x.ariaCurrent}\"\n aria-describedby=\"${x => x.ariaDescribedby}\"\n aria-details=\"${x => x.ariaDetails}\"\n aria-disabled=\"${x => x.ariaDisabled}\"\n aria-errormessage=\"${x => x.ariaErrormessage}\"\n aria-flowto=\"${x => x.ariaFlowto}\"\n aria-haspopup=\"${x => x.ariaHaspopup}\"\n aria-hidden=\"${x => x.ariaHidden}\"\n aria-invalid=\"${x => x.ariaInvalid}\"\n aria-keyshortcuts=\"${x => x.ariaKeyshortcuts}\"\n aria-label=\"${x => x.ariaLabel}\"\n aria-labelledby=\"${x => x.ariaLabelledby}\"\n aria-live=\"${x => x.ariaLive}\"\n aria-owns=\"${x => x.ariaOwns}\"\n aria-relevant=\"${x => x.ariaRelevant}\"\n aria-roledescription=\"${x => x.ariaRoledescription}\"\n aria-required=\"${x => x.requiredVisible}\"\n ${ref('control')}\n />\n ${when(\n x => !x.hideStep && !x.readOnly && !x.disabled,\n html<NumberField>`\n <div class=\"controls\" part=\"controls\">\n <div\n class=\"step-up\"\n part=\"step-up\"\n @click=\"${x => x.stepUp()}\"\n >\n <slot name=\"step-up-glyph\">\n ${definition.stepUpGlyph ?? ''}\n </slot>\n </div>\n <div\n class=\"step-down\"\n part=\"step-down\"\n @click=\"${x => x.stepDown()}\"\n >\n <slot name=\"step-down-glyph\">\n ${definition.stepDownGlyph ?? ''}\n </slot>\n </div>\n </div>\n `\n )}\n ${endSlotTemplate(context, definition)}\n </div>\n </template>\n`;\n"]}
|
|
@@ -75,7 +75,7 @@ export class RichTextEditor extends mixinErrorPattern(RichText) {
|
|
|
75
75
|
if (node.type.name.startsWith(mentionPluginPrefix)) {
|
|
76
76
|
hasMention = true;
|
|
77
77
|
}
|
|
78
|
-
const continueDescent = hasMention
|
|
78
|
+
const continueDescent = !hasMention;
|
|
79
79
|
return continueDescent;
|
|
80
80
|
});
|
|
81
81
|
return !hasMention;
|
|
@@ -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 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-object-type\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;\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-object-type\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"]}
|
|
@@ -250,7 +250,7 @@ function updateLinkAndMentionNodes(tiptapEditor, fragment) {
|
|
|
250
250
|
const updatedNodes = [];
|
|
251
251
|
fragment.forEach(node => {
|
|
252
252
|
if (node.isText && node.marks.length > 0) {
|
|
253
|
-
const linkMark = node.marks.find(mark => mark.type.name === 'link'
|
|
253
|
+
const linkMark = node.marks.find(mark => mark.type.name === 'link');
|
|
254
254
|
if (linkMark) {
|
|
255
255
|
// Checks if the link is valid link or not
|
|
256
256
|
// Needing to separately validate the link on paste is a workaround for a tiptap issue
|
|
@@ -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 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"]}
|
|
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'\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"]}
|
|
@@ -261,9 +261,7 @@ export class RichTextEditorPageObject {
|
|
|
261
261
|
tagNames.push(`/${el.tagName}`);
|
|
262
262
|
}
|
|
263
263
|
};
|
|
264
|
-
|
|
265
|
-
processNode(tiptapEditor);
|
|
266
|
-
}
|
|
264
|
+
processNode(tiptapEditor);
|
|
267
265
|
return tagNames.slice(1, -1);
|
|
268
266
|
}
|
|
269
267
|
getFormattingButtonTextContent(toolbarButton) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rich-text-editor.pageobject.js","sourceRoot":"","sources":["../../../../../src/rich-text/editor/testing/rich-text-editor.pageobject.ts"],"names":[],"mappings":"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","sourcesContent":["import { keySpace, keyEnter, keyTab, keyEscape } from '@ni/fast-web-utilities';\nimport type { RichTextEditor } from '..';\nimport { waitForUpdatesAsync } from '../../../testing/async-helpers';\nimport { toggleButtonTag, type ToggleButton } from '../../../toggle-button';\nimport {\n ArrowKeyButton,\n type MappingConfiguration,\n ToolbarButton,\n type ToolbarButtonKey\n} from './types';\nimport {\n getTagsFromElement,\n getLeafContentsFromElement,\n getLastChildElement,\n getLastChildElementAttribute\n} from '../../models/testing/markdown-parser-utils';\nimport { richTextMentionUsersViewTag } from '../../../rich-text-mention/users/view';\nimport { RichTextMarkdownParser } from '../../models/markdown-parser';\nimport { buttonTag, type Button } from '../../../button';\nimport { richTextMentionListboxTag } from '../../mention-listbox';\nimport { listOptionTag, type ListOption } from '../../../list-option';\nimport { anchoredRegionTag } from '../../../anchored-region';\nimport { iconAtTag } from '../../../icons/at';\nimport { MarkdownParserMentionConfiguration } from '../../models/markdown-parser-mention-configuration';\nimport { MentionInternals } from '../../../rich-text-mention/base/models/mention-internals';\nimport { MappingUserConfig } from '../../../rich-text-mention/users/models/mapping-user-config';\nimport { RichTextMentionUsersValidator } from '../../../rich-text-mention/users/models/rich-text-mention-users-validator';\n\n/**\n * Page object for the `nimble-rich-text-editor` component.\n */\nexport class RichTextEditorPageObject {\n public constructor(\n private readonly richTextEditorElement: RichTextEditor\n ) {}\n\n public editorSectionHasChildNodes(): boolean {\n const editorSection = this.getEditorSection();\n return editorSection!.hasChildNodes();\n }\n\n public getEditorSectionFirstElementChildClassName(): string {\n const editorSection = this.getEditorSection();\n return editorSection!.firstElementChild!.className;\n }\n\n public async clickEditorShortcutKeys(\n shortcutKey: string,\n isShiftKey: boolean\n ): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: shortcutKey,\n ctrlKey: true,\n shiftKey: isShiftKey,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressEnterKeyInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: keyEnter,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressEscapeKeyInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: keyEscape,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressArrowKeyInEditor(\n arrowButton: ArrowKeyButton\n ): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: arrowButton,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressShiftEnterKeysInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const shiftEnterEvent = new KeyboardEvent('keydown', {\n key: keyEnter,\n shiftKey: true,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(shiftEnterEvent);\n await waitForUpdatesAsync();\n }\n\n public async pressTabKeyInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: keyTab,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressShiftTabKeysInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const shiftTabEvent = new KeyboardEvent('keydown', {\n key: keyTab,\n shiftKey: true,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(shiftTabEvent);\n await waitForUpdatesAsync();\n }\n\n /**\n * In testing environment, when clicking on the footer button, it may not persist in the same state if any editor transaction occurs in between.\n * This behavior is likely due to dynamic modifications of formatting button states based on cursor positions during editor transactions.\n * Setting the \"force\" parameter to true activates the formatting button state; when set to false, it deactivates the state.\n * If unset, the state toggles by interacting with it once.\n */\n public async toggleFooterButton(\n button: ToolbarButton,\n force?: boolean\n ): Promise<void> {\n const toggleButton = this.getFormattingButton(button);\n const event = new Event('mousedown', { bubbles: true });\n toggleButton!.dispatchEvent(event);\n toggleButton!.click();\n let format = Object.keys(ToolbarButton).find(\n key => ToolbarButton[key as ToolbarButtonKey] === button\n );\n // In the editor, the isActive() method expects the format name to be 'italic' instead of 'italics.'\n // As it was consistently represent it as 'italics' elsewhere just updated it here\n if (format === 'italics') {\n format = 'italic';\n }\n if (force === true || force === false) {\n if (\n this.richTextEditorElement.tiptapEditor.isActive(format!)\n !== force\n ) {\n toggleButton!.dispatchEvent(event);\n toggleButton!.click();\n }\n }\n await waitForUpdatesAsync();\n }\n\n public async clickUserMentionButton(): Promise<void> {\n const userMentionButton = this.getUserMentionButton();\n userMentionButton!.click();\n await waitForUpdatesAsync();\n }\n\n public getMentionButtonIcon(buttonIndex: number): string | undefined {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons[buttonIndex]?.firstElementChild?.tagName;\n }\n\n public getMentionButtonTitle(buttonIndex: number): string {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons[buttonIndex]?.getAttribute('title') ?? '';\n }\n\n public getMentionButtonLabel(buttonIndex: number): string {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons[buttonIndex]?.innerText ?? '';\n }\n\n public getButtonCheckedState(button: ToolbarButton): boolean {\n const toggleButton = this.getFormattingButton(button);\n return toggleButton!.checked;\n }\n\n public getButtonTabIndex(button: ToolbarButton): number {\n const toggleButton = this.getFormattingButton(button);\n return toggleButton!.tabIndex;\n }\n\n public spaceKeyActivatesButton(button: ToolbarButton): void {\n const toggleButton = this.getFormattingButton(button)!;\n const event = new KeyboardEvent('keypress', {\n key: keySpace\n } as KeyboardEventInit);\n toggleButton.control.dispatchEvent(event);\n }\n\n public enterKeyActivatesButton(button: ToolbarButton): void {\n const toggleButton = this.getFormattingButton(button)!;\n const event = new KeyboardEvent('keypress', {\n key: keyEnter\n } as KeyboardEventInit);\n toggleButton.control.dispatchEvent(event);\n }\n\n public async pasteToEditor(text: string): Promise<void> {\n const editor = this.getTiptapEditor();\n const pasteEvent = new ClipboardEvent('paste', {\n clipboardData: new DataTransfer()\n });\n pasteEvent.clipboardData?.setData('text/plain', text);\n editor.dispatchEvent(pasteEvent);\n\n await this.focusEditorIfMentionListboxOpened();\n }\n\n // Simulate the actual pasting of content by passing the extracted HTML string as an argument and setting the format to 'text/html',\n // as in the [DataFormat](https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer) object.\n // For example, when copying a link, the clipboard stores information that includes the anchor tag, href attribute value etc, and paste it as an HTML string\n public async pasteHTMLToEditor(htmlString: string): Promise<void> {\n const editor = this.getTiptapEditor();\n const pasteEvent = new ClipboardEvent('paste', {\n clipboardData: new DataTransfer()\n });\n pasteEvent.clipboardData?.setData('text/html', htmlString);\n editor.dispatchEvent(pasteEvent);\n\n await this.focusEditorIfMentionListboxOpened();\n }\n\n public async setEditorTextContent(value: string): Promise<void> {\n this.richTextEditorElement.tiptapEditor\n .chain()\n .focus()\n .insertContent({\n type: 'text',\n text: value\n })\n .run();\n await waitForUpdatesAsync();\n\n await this.focusEditorIfMentionListboxOpened();\n }\n\n public async setCursorPosition(position: number): Promise<void> {\n this.richTextEditorElement.tiptapEditor.commands.setTextSelection(\n position\n );\n await waitForUpdatesAsync();\n }\n\n public async replaceEditorContent(value: string): Promise<void> {\n const lastElement = this.getEditorLastChildElement();\n lastElement.parentElement!.textContent = value;\n await waitForUpdatesAsync();\n\n await this.focusEditorIfMentionListboxOpened();\n }\n\n public async sliceEditorContent(from: number, to: number): Promise<void> {\n this.richTextEditorElement.tiptapEditor\n .chain()\n .focus()\n .deleteRange({ from, to })\n .run();\n await waitForUpdatesAsync();\n\n await this.focusEditorIfMentionListboxOpened();\n }\n\n public getEditorLastChildAttribute(attribute: string): string {\n return getLastChildElementAttribute(attribute, this.getTiptapEditor());\n }\n\n public async isMentionListboxOpened(): Promise<boolean> {\n await waitForUpdatesAsync();\n\n return !this.getMentionListbox()?.shadowRoot?.querySelector(\n anchoredRegionTag\n )?.hidden;\n }\n\n public getEditorMentionViewAttributeValues(attribute: string): string[] {\n return Array.from(\n this.getTiptapEditor().querySelectorAll(richTextMentionUsersViewTag)\n ).map(el => el.getAttribute(attribute) || '');\n }\n\n public getEditorFirstChildTagName(): string {\n return this.getTiptapEditor().firstElementChild?.tagName ?? '';\n }\n\n public getEditorFirstChildTextContent(): string {\n return this.getTiptapEditor().firstElementChild?.textContent ?? '';\n }\n\n public getEditorTextContents(): string[] {\n return Array.from(this.getTiptapEditor().querySelectorAll('*')).map(\n el => el.textContent || ''\n );\n }\n\n public getEditorTagNames(): string[] {\n return getTagsFromElement(this.getTiptapEditor());\n }\n\n // Return list of tags, excluding those such as 'IMG' (prosemirror-separator) that do not affect the UI or markdown output.\n // These tags are considered extraneous and are added by prosemirror.\n public getMarkdownRenderedTagNames(): string[] {\n return getTagsFromElement(this.getTiptapEditor()).filter(\n tag => tag !== 'IMG'\n );\n }\n\n public getEditorLeafContents(): string[] {\n return getLeafContentsFromElement(this.getTiptapEditor());\n }\n\n public getEditorTagNamesWithClosingTags(): string[] {\n const tagNames: string[] = [];\n const tiptapEditor = this.getTiptapEditor();\n\n const processNode = (node: Node): void => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n tagNames.push(el.tagName);\n\n el.childNodes.forEach(processNode);\n\n tagNames.push(`/${el.tagName}`);\n }\n };\n\n if (tiptapEditor) {\n processNode(tiptapEditor);\n }\n\n return tagNames.slice(1, -1);\n }\n\n public getFormattingButtonTextContent(\n toolbarButton: ToolbarButton\n ): string {\n const button = this.getFormattingButton(toolbarButton);\n return button!.textContent!.trim();\n }\n\n public getFormattingButtonTitle(toolbarButton: ToolbarButton): string {\n const button = this.getFormattingButton(toolbarButton);\n return button!.title;\n }\n\n public isRichTextEditorActiveElement(): boolean {\n return (\n document.activeElement === this.richTextEditorElement\n && document.activeElement?.shadowRoot?.activeElement\n === this.getTiptapEditor()\n );\n }\n\n public getEditorTabIndex(): string {\n return this.getTiptapEditor().getAttribute('tabindex') ?? '';\n }\n\n public async setFooterHidden(footerHidden: boolean): Promise<void> {\n if (footerHidden) {\n this.richTextEditorElement.setAttribute('footer-hidden', '');\n } else {\n this.richTextEditorElement.removeAttribute('footer-hidden');\n }\n await waitForUpdatesAsync();\n }\n\n public isFooterHidden(): boolean {\n const footerSection = this.getFooter()!;\n return window.getComputedStyle(footerSection).display === 'none';\n }\n\n public async setDisabled(disabled: boolean): Promise<void> {\n if (disabled) {\n this.richTextEditorElement.setAttribute('disabled', '');\n } else {\n this.richTextEditorElement.removeAttribute('disabled');\n }\n await waitForUpdatesAsync();\n }\n\n public isButtonDisabled(button: ToolbarButton): boolean {\n const toggleButton = this.getFormattingButton(button)!;\n return toggleButton.hasAttribute('disabled');\n }\n\n public getPlaceholderValue(): string {\n const editor = this.getTiptapEditor();\n return editor.firstElementChild?.getAttribute('data-placeholder') ?? '';\n }\n\n public getParsedHtmlFromMarkdown(\n markdown: string,\n mappings?: MappingConfiguration[]\n ): string {\n const parserMentionConfigForUser = this.getParserMentionConfigForUser(mappings);\n const parseResult = RichTextMarkdownParser.parseMarkdownToDOM(\n markdown,\n [parserMentionConfigForUser]\n );\n return this.richTextEditorElement.xmlSerializer.serializeToString(\n parseResult.fragment\n );\n }\n\n public async focusOutEditor(): Promise<void> {\n const focusout = new FocusEvent('focusout');\n this.richTextEditorElement.dispatchEvent(focusout);\n await waitForUpdatesAsync();\n }\n\n public getMentionListboxItemsName(): string[] {\n const listItemsName: string[] = [];\n this.getAllListItemsInMentionBox().forEach(item => (item.hidden ? null : listItemsName.push(item.textContent!)));\n return listItemsName;\n }\n\n public getSelectedOption(): string {\n const nodeList = this.getAllListItemsInMentionBox();\n return (\n Array.from(nodeList).find(\n item => item.selected && !item.hasAttribute('hidden')\n )?.textContent ?? ''\n );\n }\n\n public async clickMentionListboxOption(index: number): Promise<void> {\n await this.focusEditorIfMentionListboxOpened();\n\n const listOption = this.getAllListItemsInMentionBox()[index];\n listOption?.click();\n await waitForUpdatesAsync();\n }\n\n public moveCursorToStart(): void {\n this.richTextEditorElement.tiptapEditor.commands.focus('start');\n }\n\n public getCursorPosition(): number {\n return this.richTextEditorElement.tiptapEditor.state.selection.anchor;\n }\n\n private getEditorSection(): Element | null | undefined {\n return this.richTextEditorElement.shadowRoot?.querySelector('.editor');\n }\n\n private getFooter(): Element | null | undefined {\n return this.richTextEditorElement.shadowRoot!.querySelector(\n '.footer-section'\n );\n }\n\n private getTiptapEditor(): HTMLDivElement {\n return this.richTextEditorElement.shadowRoot!.querySelector<HTMLDivElement>(\n '.ProseMirror'\n )!;\n }\n\n private getFormattingButton(\n button: ToolbarButton\n ): ToggleButton | null | undefined {\n const buttons: NodeListOf<ToggleButton> = this.richTextEditorElement.shadowRoot!.querySelectorAll(\n toggleButtonTag\n );\n return buttons[button];\n }\n\n private getUserMentionButton(): Button | null | undefined {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons.find(button => button.querySelector(iconAtTag));\n }\n\n private getMentionButtons(): Button[] | null | undefined {\n return Array.from(\n this.richTextEditorElement.shadowRoot!.querySelectorAll(buttonTag)\n );\n }\n\n private getMentionListbox(): Element | null {\n return this.richTextEditorElement.shadowRoot!.querySelector(\n richTextMentionListboxTag\n );\n }\n\n private getAllListItemsInMentionBox(): NodeListOf<ListOption> {\n return this.getMentionListbox()!.querySelectorAll(listOptionTag);\n }\n\n private getEditorLastChildElement(): Element {\n return getLastChildElement(this.getTiptapEditor())!;\n }\n\n private getParserMentionConfigForUser(\n mappings: MappingConfiguration[] = []\n ): MarkdownParserMentionConfiguration {\n const mentionInternals = new MentionInternals(\n {\n character: '',\n icon: '',\n viewElement: richTextMentionUsersViewTag,\n validator: new RichTextMentionUsersValidator()\n },\n () => {}\n );\n mentionInternals.pattern = '^user:(.*)';\n mappings.forEach(mapping => {\n const mappingConfig = new MappingUserConfig(\n mapping.key,\n mapping.displayName\n );\n mentionInternals.mappingConfigs = new Map().set(\n mapping.key,\n mappingConfig\n );\n });\n const parserMentionConfig = new MarkdownParserMentionConfiguration(\n mentionInternals\n );\n return parserMentionConfig;\n }\n\n private async focusEditorIfMentionListboxOpened(): Promise<void> {\n if (await this.isMentionListboxOpened()) {\n this.richTextEditorElement.tiptapEditor.commands.focus();\n await waitForUpdatesAsync();\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rich-text-editor.pageobject.js","sourceRoot":"","sources":["../../../../../src/rich-text/editor/testing/rich-text-editor.pageobject.ts"],"names":[],"mappings":"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","sourcesContent":["import { keySpace, keyEnter, keyTab, keyEscape } from '@ni/fast-web-utilities';\nimport type { RichTextEditor } from '..';\nimport { waitForUpdatesAsync } from '../../../testing/async-helpers';\nimport { toggleButtonTag, type ToggleButton } from '../../../toggle-button';\nimport {\n ArrowKeyButton,\n type MappingConfiguration,\n ToolbarButton,\n type ToolbarButtonKey\n} from './types';\nimport {\n getTagsFromElement,\n getLeafContentsFromElement,\n getLastChildElement,\n getLastChildElementAttribute\n} from '../../models/testing/markdown-parser-utils';\nimport { richTextMentionUsersViewTag } from '../../../rich-text-mention/users/view';\nimport { RichTextMarkdownParser } from '../../models/markdown-parser';\nimport { buttonTag, type Button } from '../../../button';\nimport { richTextMentionListboxTag } from '../../mention-listbox';\nimport { listOptionTag, type ListOption } from '../../../list-option';\nimport { anchoredRegionTag } from '../../../anchored-region';\nimport { iconAtTag } from '../../../icons/at';\nimport { MarkdownParserMentionConfiguration } from '../../models/markdown-parser-mention-configuration';\nimport { MentionInternals } from '../../../rich-text-mention/base/models/mention-internals';\nimport { MappingUserConfig } from '../../../rich-text-mention/users/models/mapping-user-config';\nimport { RichTextMentionUsersValidator } from '../../../rich-text-mention/users/models/rich-text-mention-users-validator';\n\n/**\n * Page object for the `nimble-rich-text-editor` component.\n */\nexport class RichTextEditorPageObject {\n public constructor(\n private readonly richTextEditorElement: RichTextEditor\n ) {}\n\n public editorSectionHasChildNodes(): boolean {\n const editorSection = this.getEditorSection();\n return editorSection!.hasChildNodes();\n }\n\n public getEditorSectionFirstElementChildClassName(): string {\n const editorSection = this.getEditorSection();\n return editorSection!.firstElementChild!.className;\n }\n\n public async clickEditorShortcutKeys(\n shortcutKey: string,\n isShiftKey: boolean\n ): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: shortcutKey,\n ctrlKey: true,\n shiftKey: isShiftKey,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressEnterKeyInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: keyEnter,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressEscapeKeyInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: keyEscape,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressArrowKeyInEditor(\n arrowButton: ArrowKeyButton\n ): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: arrowButton,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressShiftEnterKeysInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const shiftEnterEvent = new KeyboardEvent('keydown', {\n key: keyEnter,\n shiftKey: true,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(shiftEnterEvent);\n await waitForUpdatesAsync();\n }\n\n public async pressTabKeyInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const event = new KeyboardEvent('keydown', {\n key: keyTab,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(event);\n await waitForUpdatesAsync();\n }\n\n public async pressShiftTabKeysInEditor(): Promise<void> {\n const editor = this.getTiptapEditor();\n const shiftTabEvent = new KeyboardEvent('keydown', {\n key: keyTab,\n shiftKey: true,\n bubbles: true,\n cancelable: true\n });\n editor.dispatchEvent(shiftTabEvent);\n await waitForUpdatesAsync();\n }\n\n /**\n * In testing environment, when clicking on the footer button, it may not persist in the same state if any editor transaction occurs in between.\n * This behavior is likely due to dynamic modifications of formatting button states based on cursor positions during editor transactions.\n * Setting the \"force\" parameter to true activates the formatting button state; when set to false, it deactivates the state.\n * If unset, the state toggles by interacting with it once.\n */\n public async toggleFooterButton(\n button: ToolbarButton,\n force?: boolean\n ): Promise<void> {\n const toggleButton = this.getFormattingButton(button);\n const event = new Event('mousedown', { bubbles: true });\n toggleButton!.dispatchEvent(event);\n toggleButton!.click();\n let format = Object.keys(ToolbarButton).find(\n key => ToolbarButton[key as ToolbarButtonKey] === button\n );\n // In the editor, the isActive() method expects the format name to be 'italic' instead of 'italics.'\n // As it was consistently represent it as 'italics' elsewhere just updated it here\n if (format === 'italics') {\n format = 'italic';\n }\n if (force === true || force === false) {\n if (\n this.richTextEditorElement.tiptapEditor.isActive(format!)\n !== force\n ) {\n toggleButton!.dispatchEvent(event);\n toggleButton!.click();\n }\n }\n await waitForUpdatesAsync();\n }\n\n public async clickUserMentionButton(): Promise<void> {\n const userMentionButton = this.getUserMentionButton();\n userMentionButton!.click();\n await waitForUpdatesAsync();\n }\n\n public getMentionButtonIcon(buttonIndex: number): string | undefined {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons[buttonIndex]?.firstElementChild?.tagName;\n }\n\n public getMentionButtonTitle(buttonIndex: number): string {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons[buttonIndex]?.getAttribute('title') ?? '';\n }\n\n public getMentionButtonLabel(buttonIndex: number): string {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons[buttonIndex]?.innerText ?? '';\n }\n\n public getButtonCheckedState(button: ToolbarButton): boolean {\n const toggleButton = this.getFormattingButton(button);\n return toggleButton!.checked;\n }\n\n public getButtonTabIndex(button: ToolbarButton): number {\n const toggleButton = this.getFormattingButton(button);\n return toggleButton!.tabIndex;\n }\n\n public spaceKeyActivatesButton(button: ToolbarButton): void {\n const toggleButton = this.getFormattingButton(button)!;\n const event = new KeyboardEvent('keypress', {\n key: keySpace\n } as KeyboardEventInit);\n toggleButton.control.dispatchEvent(event);\n }\n\n public enterKeyActivatesButton(button: ToolbarButton): void {\n const toggleButton = this.getFormattingButton(button)!;\n const event = new KeyboardEvent('keypress', {\n key: keyEnter\n } as KeyboardEventInit);\n toggleButton.control.dispatchEvent(event);\n }\n\n public async pasteToEditor(text: string): Promise<void> {\n const editor = this.getTiptapEditor();\n const pasteEvent = new ClipboardEvent('paste', {\n clipboardData: new DataTransfer()\n });\n pasteEvent.clipboardData?.setData('text/plain', text);\n editor.dispatchEvent(pasteEvent);\n\n await this.focusEditorIfMentionListboxOpened();\n }\n\n // Simulate the actual pasting of content by passing the extracted HTML string as an argument and setting the format to 'text/html',\n // as in the [DataFormat](https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer) object.\n // For example, when copying a link, the clipboard stores information that includes the anchor tag, href attribute value etc, and paste it as an HTML string\n public async pasteHTMLToEditor(htmlString: string): Promise<void> {\n const editor = this.getTiptapEditor();\n const pasteEvent = new ClipboardEvent('paste', {\n clipboardData: new DataTransfer()\n });\n pasteEvent.clipboardData?.setData('text/html', htmlString);\n editor.dispatchEvent(pasteEvent);\n\n await this.focusEditorIfMentionListboxOpened();\n }\n\n public async setEditorTextContent(value: string): Promise<void> {\n this.richTextEditorElement.tiptapEditor\n .chain()\n .focus()\n .insertContent({\n type: 'text',\n text: value\n })\n .run();\n await waitForUpdatesAsync();\n\n await this.focusEditorIfMentionListboxOpened();\n }\n\n public async setCursorPosition(position: number): Promise<void> {\n this.richTextEditorElement.tiptapEditor.commands.setTextSelection(\n position\n );\n await waitForUpdatesAsync();\n }\n\n public async replaceEditorContent(value: string): Promise<void> {\n const lastElement = this.getEditorLastChildElement();\n lastElement.parentElement!.textContent = value;\n await waitForUpdatesAsync();\n\n await this.focusEditorIfMentionListboxOpened();\n }\n\n public async sliceEditorContent(from: number, to: number): Promise<void> {\n this.richTextEditorElement.tiptapEditor\n .chain()\n .focus()\n .deleteRange({ from, to })\n .run();\n await waitForUpdatesAsync();\n\n await this.focusEditorIfMentionListboxOpened();\n }\n\n public getEditorLastChildAttribute(attribute: string): string {\n return getLastChildElementAttribute(attribute, this.getTiptapEditor());\n }\n\n public async isMentionListboxOpened(): Promise<boolean> {\n await waitForUpdatesAsync();\n\n return !this.getMentionListbox()?.shadowRoot?.querySelector(\n anchoredRegionTag\n )?.hidden;\n }\n\n public getEditorMentionViewAttributeValues(attribute: string): string[] {\n return Array.from(\n this.getTiptapEditor().querySelectorAll(richTextMentionUsersViewTag)\n ).map(el => el.getAttribute(attribute) || '');\n }\n\n public getEditorFirstChildTagName(): string {\n return this.getTiptapEditor().firstElementChild?.tagName ?? '';\n }\n\n public getEditorFirstChildTextContent(): string {\n return this.getTiptapEditor().firstElementChild?.textContent ?? '';\n }\n\n public getEditorTextContents(): string[] {\n return Array.from(this.getTiptapEditor().querySelectorAll('*')).map(\n el => el.textContent || ''\n );\n }\n\n public getEditorTagNames(): string[] {\n return getTagsFromElement(this.getTiptapEditor());\n }\n\n // Return list of tags, excluding those such as 'IMG' (prosemirror-separator) that do not affect the UI or markdown output.\n // These tags are considered extraneous and are added by prosemirror.\n public getMarkdownRenderedTagNames(): string[] {\n return getTagsFromElement(this.getTiptapEditor()).filter(\n tag => tag !== 'IMG'\n );\n }\n\n public getEditorLeafContents(): string[] {\n return getLeafContentsFromElement(this.getTiptapEditor());\n }\n\n public getEditorTagNamesWithClosingTags(): string[] {\n const tagNames: string[] = [];\n const tiptapEditor = this.getTiptapEditor();\n\n const processNode = (node: Node): void => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as Element;\n tagNames.push(el.tagName);\n\n el.childNodes.forEach(processNode);\n\n tagNames.push(`/${el.tagName}`);\n }\n };\n\n processNode(tiptapEditor);\n\n return tagNames.slice(1, -1);\n }\n\n public getFormattingButtonTextContent(\n toolbarButton: ToolbarButton\n ): string {\n const button = this.getFormattingButton(toolbarButton);\n return button!.textContent!.trim();\n }\n\n public getFormattingButtonTitle(toolbarButton: ToolbarButton): string {\n const button = this.getFormattingButton(toolbarButton);\n return button!.title;\n }\n\n public isRichTextEditorActiveElement(): boolean {\n return (\n document.activeElement === this.richTextEditorElement\n && document.activeElement?.shadowRoot?.activeElement\n === this.getTiptapEditor()\n );\n }\n\n public getEditorTabIndex(): string {\n return this.getTiptapEditor().getAttribute('tabindex') ?? '';\n }\n\n public async setFooterHidden(footerHidden: boolean): Promise<void> {\n if (footerHidden) {\n this.richTextEditorElement.setAttribute('footer-hidden', '');\n } else {\n this.richTextEditorElement.removeAttribute('footer-hidden');\n }\n await waitForUpdatesAsync();\n }\n\n public isFooterHidden(): boolean {\n const footerSection = this.getFooter()!;\n return window.getComputedStyle(footerSection).display === 'none';\n }\n\n public async setDisabled(disabled: boolean): Promise<void> {\n if (disabled) {\n this.richTextEditorElement.setAttribute('disabled', '');\n } else {\n this.richTextEditorElement.removeAttribute('disabled');\n }\n await waitForUpdatesAsync();\n }\n\n public isButtonDisabled(button: ToolbarButton): boolean {\n const toggleButton = this.getFormattingButton(button)!;\n return toggleButton.hasAttribute('disabled');\n }\n\n public getPlaceholderValue(): string {\n const editor = this.getTiptapEditor();\n return editor.firstElementChild?.getAttribute('data-placeholder') ?? '';\n }\n\n public getParsedHtmlFromMarkdown(\n markdown: string,\n mappings?: MappingConfiguration[]\n ): string {\n const parserMentionConfigForUser = this.getParserMentionConfigForUser(mappings);\n const parseResult = RichTextMarkdownParser.parseMarkdownToDOM(\n markdown,\n [parserMentionConfigForUser]\n );\n return this.richTextEditorElement.xmlSerializer.serializeToString(\n parseResult.fragment\n );\n }\n\n public async focusOutEditor(): Promise<void> {\n const focusout = new FocusEvent('focusout');\n this.richTextEditorElement.dispatchEvent(focusout);\n await waitForUpdatesAsync();\n }\n\n public getMentionListboxItemsName(): string[] {\n const listItemsName: string[] = [];\n this.getAllListItemsInMentionBox().forEach(item => (item.hidden ? null : listItemsName.push(item.textContent!)));\n return listItemsName;\n }\n\n public getSelectedOption(): string {\n const nodeList = this.getAllListItemsInMentionBox();\n return (\n Array.from(nodeList).find(\n item => item.selected && !item.hasAttribute('hidden')\n )?.textContent ?? ''\n );\n }\n\n public async clickMentionListboxOption(index: number): Promise<void> {\n await this.focusEditorIfMentionListboxOpened();\n\n const listOption = this.getAllListItemsInMentionBox()[index];\n listOption?.click();\n await waitForUpdatesAsync();\n }\n\n public moveCursorToStart(): void {\n this.richTextEditorElement.tiptapEditor.commands.focus('start');\n }\n\n public getCursorPosition(): number {\n return this.richTextEditorElement.tiptapEditor.state.selection.anchor;\n }\n\n private getEditorSection(): Element | null | undefined {\n return this.richTextEditorElement.shadowRoot?.querySelector('.editor');\n }\n\n private getFooter(): Element | null | undefined {\n return this.richTextEditorElement.shadowRoot!.querySelector(\n '.footer-section'\n );\n }\n\n private getTiptapEditor(): HTMLDivElement {\n return this.richTextEditorElement.shadowRoot!.querySelector<HTMLDivElement>(\n '.ProseMirror'\n )!;\n }\n\n private getFormattingButton(\n button: ToolbarButton\n ): ToggleButton | null | undefined {\n const buttons: NodeListOf<ToggleButton> = this.richTextEditorElement.shadowRoot!.querySelectorAll(\n toggleButtonTag\n );\n return buttons[button];\n }\n\n private getUserMentionButton(): Button | null | undefined {\n const buttons: Button[] = this.getMentionButtons()!;\n return buttons.find(button => button.querySelector(iconAtTag));\n }\n\n private getMentionButtons(): Button[] | null | undefined {\n return Array.from(\n this.richTextEditorElement.shadowRoot!.querySelectorAll(buttonTag)\n );\n }\n\n private getMentionListbox(): Element | null {\n return this.richTextEditorElement.shadowRoot!.querySelector(\n richTextMentionListboxTag\n );\n }\n\n private getAllListItemsInMentionBox(): NodeListOf<ListOption> {\n return this.getMentionListbox()!.querySelectorAll(listOptionTag);\n }\n\n private getEditorLastChildElement(): Element {\n return getLastChildElement(this.getTiptapEditor())!;\n }\n\n private getParserMentionConfigForUser(\n mappings: MappingConfiguration[] = []\n ): MarkdownParserMentionConfiguration {\n const mentionInternals = new MentionInternals(\n {\n character: '',\n icon: '',\n viewElement: richTextMentionUsersViewTag,\n validator: new RichTextMentionUsersValidator()\n },\n () => {}\n );\n mentionInternals.pattern = '^user:(.*)';\n mappings.forEach(mapping => {\n const mappingConfig = new MappingUserConfig(\n mapping.key,\n mapping.displayName\n );\n mentionInternals.mappingConfigs = new Map().set(\n mapping.key,\n mappingConfig\n );\n });\n const parserMentionConfig = new MarkdownParserMentionConfiguration(\n mentionInternals\n );\n return parserMentionConfig;\n }\n\n private async focusEditorIfMentionListboxOpened(): Promise<void> {\n if (await this.isMentionListboxOpened()) {\n this.richTextEditorElement.tiptapEditor.commands.focus();\n await waitForUpdatesAsync();\n }\n }\n}\n"]}
|
|
@@ -99,7 +99,7 @@ export declare class RichTextMentionListbox extends FoundationListbox {
|
|
|
99
99
|
*
|
|
100
100
|
* @internal
|
|
101
101
|
*/
|
|
102
|
-
anchorElementChanged(prev: HTMLElement, next: HTMLElement): void;
|
|
102
|
+
anchorElementChanged(prev: HTMLElement | undefined, next: HTMLElement): void;
|
|
103
103
|
/**
|
|
104
104
|
* Observes the anchor region.
|
|
105
105
|
*
|
|
@@ -49,7 +49,7 @@ export class RichTextMentionListbox extends FoundationListbox {
|
|
|
49
49
|
*/
|
|
50
50
|
get options() {
|
|
51
51
|
Observable.track(this, 'options');
|
|
52
|
-
return this.filteredOptions?.length ? this.filteredOptions : [];
|
|
52
|
+
return this.filteredOptions?.length > 0 ? this.filteredOptions : [];
|
|
53
53
|
}
|
|
54
54
|
set options(value) {
|
|
55
55
|
this._options = value;
|
|
@@ -119,7 +119,7 @@ export class RichTextMentionListbox extends FoundationListbox {
|
|
|
119
119
|
this._options.forEach(o => {
|
|
120
120
|
o.hidden = !this.filteredOptions.includes(o);
|
|
121
121
|
});
|
|
122
|
-
if (this.filteredOptions.length) {
|
|
122
|
+
if (this.filteredOptions.length > 0) {
|
|
123
123
|
this.selectedOptions = [this.filteredOptions[0]];
|
|
124
124
|
this.selectedIndex = this.options.indexOf(this.firstSelectedOption);
|
|
125
125
|
}
|
|
@@ -209,7 +209,7 @@ export class RichTextMentionListbox extends FoundationListbox {
|
|
|
209
209
|
* Overrides: `Listbox.focusAndScrollOptionIntoView`
|
|
210
210
|
*/
|
|
211
211
|
focusAndScrollOptionIntoView() {
|
|
212
|
-
if (this.open && this.firstSelectedOption) {
|
|
212
|
+
if (this.open && this.firstSelectedOption !== null) {
|
|
213
213
|
requestAnimationFrame(() => {
|
|
214
214
|
this.firstSelectedOption?.scrollIntoView({ block: 'nearest' });
|
|
215
215
|
});
|