UNPKG

ngx-tiptap-editor

Version:

[![Build and Publish](https://github.com/HuiiBuh/ngx-tiptap-editor/actions/workflows/publish.yml/badge.svg)](https://github.com/HuiiBuh/ngx-tiptap-editor/actions/workflows/publish.yml) [![Deploy to Github Pages](https://github.com/HuiiBuh/ngx-tiptap-edito

107 lines 16.6 kB
import { DOCUMENT } from '@angular/common'; import { Inject, Injectable } from '@angular/core'; import { Editor, mergeAttributes } from '@tiptap/core'; import { Mention } from '@tiptap/extension-mention'; import { fromEvent, Subject } from 'rxjs'; import { AdvancedBaseExtension } from '../../tip-base-extension'; import { MENTION_FETCH, MentionPreviewComponent } from './mention-preview.component'; import * as i0 from "@angular/core"; import * as i1 from "../../../services/dialog.service"; // @dynamic export class NgxMention extends AdvancedBaseExtension { // tslint:enable:member-ordering constructor(injector, ngZone, document, dialogService) { super(); this.injector = injector; this.ngZone = ngZone; this.document = document; this.dialogService = dialogService; // tslint:disable:member-ordering this._onClick$ = new Subject(); this.onClick$ = this._onClick$.asObservable(); this.defaultOptions = { HTMLAttributes: { class: 'mention' }, previewComponent: MentionPreviewComponent }; } createExtension(extensionOptions) { const extendedMention = this.extendMention(); const mentionOptions = this.configureMention(extensionOptions); return extendedMention.configure(mentionOptions); } extendMention() { const listeners = []; const self = this; return Mention.extend({ // Remove listeners onDestroy: () => listeners.forEach(l => l.unsubscribe()), renderHTML({ node, HTMLAttributes }) { const span = document.createElement('span'); span.textContent = this.options.renderLabel({ options: this.options, node }); // Subscribe to click events and pass them to the onClick Subject const subscription = fromEvent(span, 'click').subscribe(() => self._onClick$.next(node.attrs)); listeners.push(subscription); const attributes = mergeAttributes({ 'data-mention': '' }, this.options.HTMLAttributes, HTMLAttributes); Object.keys(attributes).forEach(key => span.setAttribute(key, attributes[key])); return span; }, addCommands() { return { setMention: ({ range, props }) => ({ commands, state }) => { // If range was not provided just insert at the current position if (!range) range = state.selection; return commands.insertContentAt(range, [ { type: 'mention', attrs: props, }, { type: 'text', text: ' ', }, ]); } }; }, }); } configureMention({ ...mentionOptions }) { // Check if the fetch function is provided and if not don't register events for it if (mentionOptions.mentionFetchFunction) { mentionOptions.suggestion = { render: () => { let component; let remove; return this.ngZone.run(() => ({ onStart: props => { component = this.createComponent(mentionOptions.previewComponent, [{ provide: Editor, useValue: props.editor }, { provide: MENTION_FETCH, useValue: mentionOptions.mentionFetchFunction }]); component.instance.updateProps(props); remove = this.insertComponent(component, this.document.body); }, onKeyDown: (props) => component.instance.handleKeyPress(props.event), onUpdate: props => component.instance.updateProps(props), onExit: () => remove.remove(), })); }, ...mentionOptions.suggestion }; } return mentionOptions; } } NgxMention.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: NgxMention, deps: [{ token: i0.Injector }, { token: i0.NgZone }, { token: DOCUMENT }, { token: i1.TipDialogService }], target: i0.ɵɵFactoryTarget.Injectable }); NgxMention.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: NgxMention }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: NgxMention, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.NgZone }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i1.TipDialogService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1lbnRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGlwdGFwLWVkaXRvci9zcmMvbGliL2V4dGVuc2lvbnMvY3VzdG9tL21lbnRpb24vbmd4LW1lbnRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBZ0IsTUFBTSxFQUFFLFVBQVUsRUFBMEIsTUFBTSxlQUFlLENBQUM7QUFDekYsT0FBTyxFQUFnQixNQUFNLEVBQUUsZUFBZSxFQUE0QixNQUFNLGNBQWMsQ0FBQztBQUMvRixPQUFPLEVBQUUsT0FBTyxFQUFrQixNQUFNLDJCQUEyQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUV4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNqRSxPQUFPLEVBQ0wsYUFBYSxFQUViLHVCQUF1QixFQUV4QixNQUFNLDZCQUE2QixDQUFDOzs7QUFzQnJDLFdBQVc7QUFFWCxNQUFNLE9BQU8sVUFBVyxTQUFRLHFCQUF3QztJQVd0RSxnQ0FBZ0M7SUFFaEMsWUFDWSxRQUFrQixFQUNwQixNQUFjLEVBQ0ksUUFBa0IsRUFDcEMsYUFBK0I7UUFFdkMsS0FBSyxFQUFFLENBQUM7UUFMRSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDSSxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQWZ6QyxpQ0FBaUM7UUFDekIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFDeEMsYUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFekMsbUJBQWMsR0FBRztZQUN0QixjQUFjLEVBQUUs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RUFBRSxDQUFDLENBQUM7d0JBQzVCLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRTs0QkFDZixTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztvQ0FDakUsT0FBTyxFQUFFLE1BQU07b0NBQ2YsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNO2lDQUN2QixFQUFFO29DQUNELE9BQU8sRUFBRSxhQUFhO29DQUN0QixRQUFRLEVBQUUsY0FBYyxDQUFDLG9CQUFvQjtpQ0FDOUMsQ0FBQyxDQUFDLENBQUM7NEJBQ0osU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ3RDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUMvRCxDQUFDO3dCQUNELFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQzt3QkFDcEUsUUFBUSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO3dCQUN4RCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtxQkFDOUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ04sQ0FBQztnQkFDRCxHQUFHLGNBQWMsQ0FBQyxVQUFVO2FBQzdCLENBQUM7U0FDSDtRQUVELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7O3VHQXJHVSxVQUFVLGdFQWdCWCxRQUFROzJHQWhCUCxVQUFVOzJGQUFWLFVBQVU7a0JBRHRCLFVBQVU7c0dBaUI2QixRQUFROzBCQUEzQyxNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnRSZWYsIEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE5nWm9uZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQW55RXh0ZW5zaW9uLCBFZGl0b3IsIG1lcmdlQXR0cmlidXRlcywgTm9kZSwgUmFuZ2UsIFJhd0NvbW1hbmRzIH0gZnJvbSAnQHRpcHRhcC9jb3JlJztcbmltcG9ydCB7IE1lbnRpb24sIE1lbnRpb25PcHRpb25zIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tbWVudGlvbic7XG5pbXBvcnQgeyBOb2RlIGFzIFByb3NlTWlycm9yTm9kZSB9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUaXBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZGlhbG9nLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWR2YW5jZWRCYXNlRXh0ZW5zaW9uIH0gZnJvbSAnLi4vLi4vdGlwLWJhc2UtZXh0ZW5zaW9uJztcbmltcG9ydCB7XG4gIE1FTlRJT05fRkVUQ0gsXG4gIE1lbnRpb25GZXRjaEZ1bmN0aW9uLFxuICBNZW50aW9uUHJldmlld0NvbXBvbmVudCxcbiAgTWVudGlvblByZXZpZXdJbnRlcmZhY2Vcbn0gZnJvbSAnLi9tZW50aW9uLXByZXZpZXcuY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgTWVudGlvbkRhdGEgPSB7IGlkOiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nIH0gfCB7IGlkOiBzdHJpbmcsIGxhYmVsOiBudWxsOyB9O1xuXG5kZWNsYXJlIG1vZHVsZSAnQHRpcHRhcC9jb3JlJyB7XG4gIGludGVyZmFjZSBDb21tYW5kczxSZXR1cm5UeXBlPiB7XG4gICAgbWVudGlvbjoge1xuICAgICAgc2V0TWVudGlvbjogKGF0dHJpYnV0ZXM6IHsgcmFuZ2U/OiBSYW5nZSB8IG51bWJlciwgcHJvcHM6IE1lbnRpb25EYXRhIH0pID0+IFJldHVyblR5cGUsXG4gICAgfTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgTmd4TWVudGlvbk9wdGlvbnMge1xuICBwcmV2aWV3Q29tcG9uZW50OiBUeXBlPE1lbnRpb25QcmV2aWV3SW50ZXJmYWNlPjtcbiAgSFRNTEF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHJlbmRlckxhYmVsOiAocHJvcHM6IHtcbiAgICBvcHRpb25zOiBNZW50aW9uT3B0aW9ucyxcbiAgICBub2RlOiBQcm9zZU1pcnJvck5vZGUsXG4gIH0pID0+IHN0cmluZztcbiAgbWVudGlvbkZldGNoRnVuY3Rpb24/OiBNZW50aW9uRmV0Y2hGdW5jdGlvbjtcbn1cblxuLy8gQGR5bmFtaWNcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ3hNZW50aW9uIGV4dGVuZHMgQWR2YW5jZWRCYXNlRXh0ZW5zaW9uPE5neE1lbnRpb25PcHRpb25zPiB7XG5cbiAgLy8gdHNsaW50OmRpc2FibGU6bWVtYmVyLW9yZGVyaW5nXG4gIHByaXZhdGUgX29uQ2xpY2skID0gbmV3IFN1YmplY3Q8TWVudGlvbkRhdGE+KCk7XG4gIHB1YmxpYyBvbkNsaWNrJCA9IHRoaXMuX29uQ2xpY2skLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIHB1YmxpYyBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBIVE1MQXR0cmlidXRlczoge2NsYXNzOiAnbWVudGlvbid9LFxuICAgIHByZXZpZXdDb21wb25lbnQ6IE1lbnRpb25QcmV2aWV3Q29tcG9uZW50XG4gIH07XG5cbiAgLy8gdHNsaW50OmVuYWJsZTptZW1iZXItb3JkZXJpbmdcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBUaXBEaWFsb2dTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRXh0ZW5zaW9uKGV4dGVuc2lvbk9wdGlvbnM6IFJlcXVpcmVkPE5neE1lbnRpb25PcHRpb25zPik6IEFueUV4dGVuc2lvbiB7XG4gICAgY29uc3QgZXh0ZW5kZWRNZW50aW9uID0gdGhpcy5leHRlbmRNZW50aW9uKCk7XG4gICAgY29uc3QgbWVudGlvbk9wdGlvbnMgPSB0aGlzLmNvbmZpZ3VyZU1lbnRpb24oZXh0ZW5zaW9uT3B0aW9ucyk7XG4gICAgcmV0dXJuIGV4dGVuZGVkTWVudGlvbi5jb25maWd1cmUobWVudGlvbk9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRlbmRNZW50aW9uKCk6IE5vZGU8TWVudGlvbk9wdGlvbnM+IHtcbiAgICBjb25zdCBsaXN0ZW5lcnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICByZXR1cm4gTWVudGlvbi5leHRlbmQoe1xuICAgICAgLy8gUmVtb3ZlIGxpc3RlbmVyc1xuICAgICAgb25EZXN0cm95OiAoKSA9PiBsaXN0ZW5lcnMuZm9yRWFjaChsID0+IGwudW5zdWJzY3JpYmUoKSksXG4gICAgICByZW5kZXJIVE1MKHtub2RlLCBIVE1MQXR0cmlidXRlc30pOiBhbnkge1xuXG4gICAgICAgIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHNwYW4udGV4dENvbnRlbnQgPSB0aGlzLm9wdGlvbnMucmVuZGVyTGFiZWwoe29wdGlvbnM6IHRoaXMub3B0aW9ucywgbm9kZX0pO1xuICAgICAgICAvLyBTdWJzY3JpYmUgdG8gY2xpY2sgZXZlbnRzIGFuZCBwYXNzIHRoZW0gdG8gdGhlIG9uQ2xpY2sgU3ViamVjdFxuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQoc3BhbiwgJ2NsaWNrJykuc3Vic2NyaWJlKCgpID0+IHNlbGYuX29uQ2xpY2skLm5leHQobm9kZS5hdHRycyBhcyBhbnkpKTtcbiAgICAgICAgbGlzdGVuZXJzLnB1c2goc3Vic2NyaXB0aW9uKTtcblxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gbWVyZ2VBdHRyaWJ1dGVzKHsnZGF0YS1tZW50aW9uJzogJyd9LCB0aGlzLm9wdGlvbnMuSFRNTEF0dHJpYnV0ZXMsIEhUTUxBdHRyaWJ1dGVzKTtcbiAgICAgICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChrZXkgPT4gc3Bhbi5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyaWJ1dGVzW2tleV0pKTtcblxuICAgICAgICByZXR1cm4gc3BhbjtcbiAgICAgIH0sXG4gICAgICBhZGRDb21tYW5kcygpOiBQYXJ0aWFsPFJhd0NvbW1hbmRzPiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2V0TWVudGlvbjogKHtyYW5nZSwgcHJvcHN9KSA9PiAoe2NvbW1hbmRzLCBzdGF0ZX0pID0+IHtcblxuICAgICAgICAgICAgLy8gSWYgcmFuZ2Ugd2FzIG5vdCBwcm92aWRlZCBqdXN0IGluc2VydCBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAgICAgICAgaWYgKCFyYW5nZSkgcmFuZ2UgPSBzdGF0ZS5zZWxlY3Rpb247XG5cbiAgICAgICAgICAgIHJldHVybiBjb21tYW5kcy5pbnNlcnRDb250ZW50QXQocmFuZ2UsIFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdtZW50aW9uJyxcbiAgICAgICAgICAgICAgICBhdHRyczogcHJvcHMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgdGV4dDogJyAnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlTWVudGlvbih7Li4ubWVudGlvbk9wdGlvbnN9OiBQYXJ0aWFsPE1lbnRpb25PcHRpb25zPiAmIE5neE1lbnRpb25PcHRpb25zKTogTmd4TWVudGlvbk9wdGlvbnMge1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZldGNoIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGFuZCBpZiBub3QgZG9uJ3QgcmVnaXN0ZXIgZXZlbnRzIGZvciBpdFxuICAgIGlmIChtZW50aW9uT3B0aW9ucy5tZW50aW9uRmV0Y2hGdW5jdGlvbikge1xuICAgICAgbWVudGlvbk9wdGlvbnMuc3VnZ2VzdGlvbiA9IHtcbiAgICAgICAgcmVuZGVyOiAoKSA9PiB7XG4gICAgICAgICAgbGV0IGNvbXBvbmVudDogQ29tcG9uZW50UmVmPE1lbnRpb25QcmV2aWV3SW50ZXJmYWNlPjtcbiAgICAgICAgICBsZXQgcmVtb3ZlOiB7IHJlbW92ZTogKCkgPT4gdm9pZDsgfTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuKCgpID0+ICh7XG4gICAgICAgICAgICBvblN0YXJ0OiBwcm9wcyA9PiB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudCA9IHRoaXMuY3JlYXRlQ29tcG9uZW50KG1lbnRpb25PcHRpb25zLnByZXZpZXdDb21wb25lbnQsIFt7XG4gICAgICAgICAgICAgICAgcHJvdmlkZTogRWRpdG9yLFxuICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBwcm9wcy5lZGl0b3JcbiAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHByb3ZpZGU6IE1FTlRJT05fRkVUQ0gsXG4gICAgICAgICAgICAgICAgdXNlVmFsdWU6IG1lbnRpb25PcHRpb25zLm1lbnRpb25GZXRjaEZ1bmN0aW9uXG4gICAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICAgICAgY29tcG9uZW50Lmluc3RhbmNlLnVwZGF0ZVByb3BzKHByb3BzKTtcbiAgICAgICAgICAgICAgcmVtb3ZlID0gdGhpcy5pbnNlcnRDb21wb25lbnQoY29tcG9uZW50LCB0aGlzLmRvY3VtZW50LmJvZHkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uS2V5RG93bjogKHByb3BzKSA9PiBjb21wb25lbnQuaW5zdGFuY2UuaGFuZGxlS2V5UHJlc3MocHJvcHMuZXZlbnQpLFxuICAgICAgICAgICAgb25VcGRhdGU6IHByb3BzID0+IGNvbXBvbmVudC5pbnN0YW5jZS51cGRhdGVQcm9wcyhwcm9wcyksXG4gICAgICAgICAgICBvbkV4aXQ6ICgpID0+IHJlbW92ZS5yZW1vdmUoKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIC4uLm1lbnRpb25PcHRpb25zLnN1Z2dlc3Rpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbnRpb25PcHRpb25zO1xuICB9XG59XG4iXX0=