UNPKG

ngx-editor

Version:

Rich Text Editor for angular using ProseMirror

97 lines 13.9 kB
import { Component, HostBinding, HostListener, Input, } from '@angular/core'; import { ToggleCommands } from '../MenuCommands'; import * as i0 from "@angular/core"; import * as i1 from "../../../editor.service"; import * as i2 from "../menu.service"; import * as i3 from "@angular/common"; export class DropdownComponent { constructor(ngxeService, menuService, el) { this.ngxeService = ngxeService; this.menuService = menuService; this.el = el; this.isDropdownOpen = false; this.disabledItems = []; this.update = (view) => { const { state } = view; this.disabledItems = []; const activeItems = []; this.items.forEach((item) => { const command = ToggleCommands[item]; const isActive = command.isActive(state); if (isActive) { activeItems.push(item); } if (!command.canExecute(state)) { this.disabledItems.push(item); } }); if (activeItems.length === 1) { [this.activeItem] = activeItems; } else { this.activeItem = null; } }; } get isSelected() { return Boolean(this.activeItem || this.isDropdownOpen); } get isDropdownDisabled() { return this.disabledItems.length === this.items.length; } onDocumentClick(target) { if (!this.el.nativeElement.contains(target) && this.isDropdownOpen) { this.isDropdownOpen = false; } } getName(key) { return this.ngxeService.locals.get(key); } toggleDropdown(e) { e.preventDefault(); this.isDropdownOpen = !this.isDropdownOpen; } trackByIndex(index) { return index; } onClick(e, item) { e.preventDefault(); // consider only left click if (e.button !== 0) { return; } const command = ToggleCommands[item]; const { state, dispatch } = this.editorView; command.toggle()(state, dispatch); this.isDropdownOpen = false; } ngOnInit() { this.editorView = this.menuService.editor.view; this.updateSubscription = this.menuService.editor.update.subscribe((view) => { this.update(view); }); } ngOnDestroy() { this.updateSubscription.unsubscribe(); } } DropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: DropdownComponent, deps: [{ token: i1.NgxEditorService }, { token: i2.MenuService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); DropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: DropdownComponent, selector: "ngx-dropdown", inputs: { group: "group", items: "items" }, host: { listeners: { "document:mousedown": "onDocumentClick($event.target)" }, properties: { "class.NgxEditor__Dropdown--Selected": "this.isSelected", "class.NgxEditor--Disabled": "this.isDropdownDisabled" } }, ngImport: i0, template: "<div class=\"NgxEditor__Dropdown--Text\" (mousedown)=\"toggleDropdown($event)\">\n {{getName(activeItem || group)}}\n</div>\n\n<div class=\"NgxEditor__Dropdown--DropdownMenu\" *ngIf=\"isDropdownOpen\">\n <div class=\"NgxEditor__Dropdown--Item\" *ngFor=\"let item of items; trackBy: trackByIndex\" (mousedown)=\"onClick($event, item)\"\n [ngClass]=\"{'NgxEditor__Dropdown--Active': item === activeItem, 'NgxEditor--Disabled':disabledItems.includes(item)}\">\n {{getName(item)}}\n </div>\n</div>\n", styles: [""], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: DropdownComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-dropdown', template: "<div class=\"NgxEditor__Dropdown--Text\" (mousedown)=\"toggleDropdown($event)\">\n {{getName(activeItem || group)}}\n</div>\n\n<div class=\"NgxEditor__Dropdown--DropdownMenu\" *ngIf=\"isDropdownOpen\">\n <div class=\"NgxEditor__Dropdown--Item\" *ngFor=\"let item of items; trackBy: trackByIndex\" (mousedown)=\"onClick($event, item)\"\n [ngClass]=\"{'NgxEditor__Dropdown--Active': item === activeItem, 'NgxEditor--Disabled':disabledItems.includes(item)}\">\n {{getName(item)}}\n </div>\n</div>\n", styles: [""] }] }], ctorParameters: function () { return [{ type: i1.NgxEditorService }, { type: i2.MenuService }, { type: i0.ElementRef }]; }, propDecorators: { group: [{ type: Input }], items: [{ type: Input }], isSelected: [{ type: HostBinding, args: ['class.NgxEditor__Dropdown--Selected'] }], isDropdownDisabled: [{ type: HostBinding, args: ['class.NgxEditor--Disabled'] }], onDocumentClick: [{ type: HostListener, args: ['document:mousedown', ['$event.target']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVkaXRvci9zcmMvbGliL21vZHVsZXMvbWVudS9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRpdG9yL3NyYy9saWIvbW9kdWxlcy9tZW51L2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQWMsV0FBVyxFQUNsQyxZQUFZLEVBQUUsS0FBSyxHQUNwQixNQUFNLGVBQWUsQ0FBQztBQU12QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7O0FBUWpELE1BQU0sT0FBTyxpQkFBaUI7SUFZNUIsWUFDVSxXQUE2QixFQUM3QixXQUF3QixFQUN4QixFQUFjO1FBRmQsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLE9BQUUsR0FBRixFQUFFLENBQVk7UUFSeEIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFdkIsa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFrRHJCLFdBQU0sR0FBRyxDQUFDLElBQWdCLEVBQUUsRUFBRTtZQUNwQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUV2QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQW9CLEVBQUUsRUFBRTtnQkFDMUMsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUss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Q0FBcUM7Z0JBSUosa0JBQWtCO3NCQUEvRCxXQUFXO3VCQUFDLDJCQUEyQjtnQkFJZSxlQUFlO3NCQUFyRSxZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRWRpdG9yVmlldyB9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IE5neEVkaXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBNZW51U2VydmljZSB9IGZyb20gJy4uL21lbnUuc2VydmljZSc7XG5pbXBvcnQgeyBUb2dnbGVDb21tYW5kcyB9IGZyb20gJy4uL01lbnVDb21tYW5kcyc7XG5pbXBvcnQgeyBUQkhlYWRpbmdJdGVtcyB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWRyb3Bkb3duJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZHJvcGRvd24uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgZWRpdG9yVmlldzogRWRpdG9yVmlldztcbiAgcHJpdmF0ZSB1cGRhdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBASW5wdXQoKSBncm91cDogc3RyaW5nO1xuICBASW5wdXQoKSBpdGVtczogVEJIZWFkaW5nSXRlbXNbXTtcblxuICBpc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuXG4gIGRpc2FibGVkSXRlbXM6IHN0cmluZ1tdID0gW107XG4gIGFjdGl2ZUl0ZW06IHN0cmluZyB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuZ3hlU2VydmljZTogTmd4RWRpdG9yU2VydmljZSxcbiAgICBwcml2YXRlIG1lbnVTZXJ2aWNlOiBNZW51U2VydmljZSxcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICApIHsgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuTmd4RWRpdG9yX19Ecm9wZG93bi0tU2VsZWN0ZWQnKSBnZXQgaXNTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLmFjdGl2ZUl0ZW0gfHwgdGhpcy5pc0Ryb3Bkb3duT3Blbik7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLk5neEVkaXRvci0tRGlzYWJsZWQnKSBnZXQgaXNEcm9wZG93bkRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkSXRlbXMubGVuZ3RoID09PSB0aGlzLml0ZW1zLmxlbmd0aDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlZG93bicsIFsnJGV2ZW50LnRhcmdldCddKSBvbkRvY3VtZW50Q2xpY2sodGFyZ2V0OiBOb2RlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSAmJiB0aGlzLmlzRHJvcGRvd25PcGVuKSB7XG4gICAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0TmFtZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubmd4ZVNlcnZpY2UubG9jYWxzLmdldChrZXkpO1xuICB9XG5cbiAgdG9nZ2xlRHJvcGRvd24oZTogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gIXRoaXMuaXNEcm9wZG93bk9wZW47XG4gIH1cblxuICB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgb25DbGljayhlOiBNb3VzZUV2ZW50LCBpdGVtOiBUQkhlYWRpbmdJdGVtcyk6IHZvaWQge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIGNvbnNpZGVyIG9ubHkgbGVmdCBjbGlja1xuICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbW1hbmQgPSBUb2dnbGVDb21tYW5kc1tpdGVtXTtcbiAgICBjb25zdCB7IHN0YXRlLCBkaXNwYXRjaCB9ID0gdGhpcy5lZGl0b3JWaWV3O1xuICAgIGNvbW1hbmQudG9nZ2xlKCkoc3RhdGUsIGRpc3BhdGNoKTtcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZSA9ICh2aWV3OiBFZGl0b3JWaWV3KSA9PiB7XG4gICAgY29uc3QgeyBzdGF0ZSB9ID0gdmlldztcbiAgICB0aGlzLmRpc2FibGVkSXRlbXMgPSBbXTtcbiAgICBjb25zdCBhY3RpdmVJdGVtcyA9IFtdO1xuXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtOiBUQkhlYWRpbmdJdGVtcykgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZCA9IFRvZ2dsZUNvbW1hbmRzW2l0ZW1dO1xuICAgICAgY29uc3QgaXNBY3RpdmUgPSBjb21tYW5kLmlzQWN0aXZlKHN0YXRlKTtcblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIGFjdGl2ZUl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghY29tbWFuZC5jYW5FeGVjdXRlKHN0YXRlKSkge1xuICAgICAgICB0aGlzLmRpc2FibGVkSXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhY3RpdmVJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIFt0aGlzLmFjdGl2ZUl0ZW1dID0gYWN0aXZlSXRlbXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlSXRlbSA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yVmlldyA9IHRoaXMubWVudVNlcnZpY2UuZWRpdG9yLnZpZXc7XG5cbiAgICB0aGlzLnVwZGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMubWVudVNlcnZpY2UuZWRpdG9yLnVwZGF0ZS5zdWJzY3JpYmUoKHZpZXc6IEVkaXRvclZpZXcpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlKHZpZXcpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIk5neEVkaXRvcl9fRHJvcGRvd24tLVRleHRcIiAobW91c2Vkb3duKT1cInRvZ2dsZURyb3Bkb3duKCRldmVudClcIj5cbiAge3tnZXROYW1lKGFjdGl2ZUl0ZW0gfHwgZ3JvdXApfX1cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiTmd4RWRpdG9yX19Ecm9wZG93bi0tRHJvcGRvd25NZW51XCIgKm5nSWY9XCJpc0Ryb3Bkb3duT3BlblwiPlxuICA8ZGl2IGNsYXNzPVwiTmd4RWRpdG9yX19Ecm9wZG93bi0tSXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIiAobW91c2Vkb3duKT1cIm9uQ2xpY2soJGV2ZW50LCBpdGVtKVwiXG4gICAgW25nQ2xhc3NdPVwieydOZ3hFZGl0b3JfX0Ryb3Bkb3duLS1BY3RpdmUnOiBpdGVtID09PSBhY3RpdmVJdGVtLCAnTmd4RWRpdG9yLS1EaXNhYmxlZCc6ZGlzYWJsZWRJdGVtcy5pbmNsdWRlcyhpdGVtKX1cIj5cbiAgICB7e2dldE5hbWUoaXRlbSl9fVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19