UNPKG

ngx-trumbowyg

Version:

This an Angular wrapper for [Trumbowyg WYSIWYG editor](https://alex-d.github.io/Trumbowyg/).

220 lines (211 loc) 17.6 kB
import { InjectionToken, Directive, ElementRef, Inject, Input, Optional, Component, ViewChild, NgModule } from '@angular/core'; import { NgControl } from '@angular/forms'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ const /** @type {?} */ TRUMBOWYG_OPTIONS = new InjectionToken('Trumbowyg options'); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @abstract */ class EditorBase { /** * @param {?} editorControl * @param {?} _config */ constructor(editorControl, _config) { this.editorControl = editorControl; this._config = _config; if (_config && _config.events && (_config.events['tbwinit'] || _config.events['tbwchange'] || _config.events['tbwfocus'])) { throw new Error('Forbidden event registration. These events are protected for the Ngx-Trumbowyg library: tbwinit, tbwchange, tbwfocus'); } editorControl.valueAccessor = this; } /** * @return {?} */ ngOnInit() { const /** @type {?} */ control = this.editorControl.control; control.setValidators(control.validator); control.updateValueAndValidity(); } /** * @return {?} */ ngAfterViewInit() { const /** @type {?} */ editor = $(this._editor.nativeElement) .trumbowyg(Object.assign({}, this._config, this.options)) .on('tbwinit', () => { this.setDisabledState(this._disabled); this.setContent(this._initValue); }) .on('tbwchange', () => { this._onChange(this.getContent()); }) .on('tbwfocus', () => { this._onTouch(); }); if (this._config && this._config.events) { const /** @type {?} */ events = this._config.events; Object.keys(events).forEach(eventName => { editor.on(eventName, events[eventName]()); }); } } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this._onChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this._onTouch = fn; } /** * @param {?} value * @return {?} */ writeValue(value) { this._initValue = value; if (this._editor && this._editor.nativeElement) { this.setContent(value); } } /** * @param {?} disabled * @return {?} */ setDisabledState(disabled) { this._disabled = disabled; if (this._editor) { $(this._editor.nativeElement).trumbowyg(this._disabled ? 'disable' : 'enable'); } } /** * @return {?} */ ngOnDestroy() { $(this._editor.nativeElement).trumbowyg('destroy'); } /** * @param {?} content * @return {?} */ setContent(content) { $(this._editor.nativeElement).trumbowyg('html', content); } /** * @return {?} */ getContent() { return $(this._editor.nativeElement).trumbowyg('html'); } } /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class EditorDirective extends EditorBase { /** * @param {?} editorControl * @param {?} _config * @param {?} _editor */ constructor(editorControl, _config, _editor) { super(editorControl, _config); this.editorControl = editorControl; this._config = _config; this._editor = _editor; } } EditorDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxTrumbowygEditor]' },] } ]; /** @nocollapse */ EditorDirective.ctorParameters = () => [ { type: NgControl }, { type: undefined, decorators: [{ type: Inject, args: [TRUMBOWYG_OPTIONS,] }, { type: Optional }] }, { type: ElementRef } ]; EditorDirective.propDecorators = { options: [{ type: Input }], placeholder: [{ type: Input }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class EditorComponent extends EditorBase { /** * @param {?} editorControl * @param {?} _config */ constructor(editorControl, _config) { super(editorControl, _config); this.editorControl = editorControl; this._config = _config; } } EditorComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'ngx-trumbowyg-editor', template: "<textarea #editor [placeholder]=\"placeholder ? placeholder : ''\"></textarea>\n", styles: [""] }] } ]; /** @nocollapse */ EditorComponent.ctorParameters = () => [ { type: NgControl }, { type: undefined, decorators: [{ type: Inject, args: [TRUMBOWYG_OPTIONS,] }, { type: Optional }] } ]; EditorComponent.propDecorators = { options: [{ type: Input }], placeholder: [{ type: Input }], _editor: [{ type: ViewChild, args: ['editor',] }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ class NgxTrumbowygModule { /** * @param {?} options * @return {?} */ static withConfig(options) { return { ngModule: NgxTrumbowygModule, providers: [{ provide: TRUMBOWYG_OPTIONS, useValue: options }] }; } } NgxTrumbowygModule.decorators = [ { type: NgModule, args: [{ declarations: [EditorDirective, EditorComponent], exports: [EditorDirective, EditorComponent] },] } ]; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export { NgxTrumbowygModule, EditorBase as ɵb, EditorComponent as ɵd, TRUMBOWYG_OPTIONS as ɵc, EditorDirective as ɵa }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRydW1ib3d5Zy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmd4LXRydW1ib3d5Zy9saWIvY29uZmlncy9pbmplY3Rpb24tdG9rZW4udHMiLCJuZzovL25neC10cnVtYm93eWcvbGliL2NvbW1vbnMvZWRpdG9yLWJhc2UudHMiLCJuZzovL25neC10cnVtYm93eWcvbGliL2RpcmVjdGl2ZS9lZGl0b3IuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gtdHJ1bWJvd3lnL2xpYi9jb21wb25lbnQvZWRpdG9yL2VkaXRvci5jb21wb25lbnQudHMiLCJuZzovL25neC10cnVtYm93eWcvbGliL25neC10cnVtYm93eWcubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcnVtYm93eWdPcHRpb25zIH0gZnJvbSAnLi90cnVtYm93eWctb3B0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBUUlVNQk9XWUdfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUcnVtYm93eWdPcHRpb25zPihcbiAgJ1RydW1ib3d5ZyBvcHRpb25zJ1xuKTtcbiIsImltcG9ydCB7IEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJ1bWJvd3lnT3B0aW9ucyB9IGZyb20gJy4uL2NvbmZpZ3MvdHJ1bWJvd3lnLW9wdGlvbnMnO1xuXG5kZWNsYXJlIGNvbnN0ICQ6IGFueTtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEVkaXRvckJhc2UgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBvcHRpb25zOiBUcnVtYm93eWdPcHRpb25zIHwgbnVsbDtcblxuICBwbGFjZWhvbGRlcjogc3RyaW5nIHwgbnVsbDtcblxuICBwcm90ZWN0ZWQgX2VkaXRvcjogRWxlbWVudFJlZjtcblxuICBwcm90ZWN0ZWQgX2luaXRWYWx1ZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcblxuICBwcml2YXRlIF9vblRvdWNoOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBlZGl0b3JDb250cm9sOiBOZ0NvbnRyb2wsIHByb3RlY3RlZCBfY29uZmlnOiBUcnVtYm93eWdPcHRpb25zKSB7XG4gICAgaWYgKFxuICAgICAgX2NvbmZpZyAmJlxuICAgICAgX2NvbmZpZy5ldmVudHMgJiZcbiAgICAgIChfY29uZmlnLmV2ZW50c1sndGJ3aW5pdCddIHx8IF9jb25maWcuZXZlbnRzWyd0YndjaGFuZ2UnXSB8fCBfY29uZmlnLmV2ZW50c1sndGJ3Zm9jdXMnXSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0ZvcmJpZGRlbiBldmVudCByZWdpc3RyYXRpb24uIFRoZXNlIGV2ZW50cyBhcmUgcHJvdGVjdGVkIGZvciB0aGUgTmd4LVRydW1ib3d5ZyBsaWJyYXJ5OiB0Yndpbml0LCB0YndjaGFuZ2UsIHRid2ZvY3VzJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZWRpdG9yQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmVkaXRvckNvbnRyb2wuY29udHJvbDtcbiAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoY29udHJvbC52YWxpZGF0b3IpO1xuICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9ICQodGhpcy5fZWRpdG9yLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAudHJ1bWJvd3lnKHsgLi4udGhpcy5fY29uZmlnLCAuLi50aGlzLm9wdGlvbnMgfSlcbiAgICAgIC5vbigndGJ3aW5pdCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXREaXNhYmxlZFN0YXRlKHRoaXMuX2Rpc2FibGVkKTtcbiAgICAgICAgdGhpcy5zZXRDb250ZW50KHRoaXMuX2luaXRWYWx1ZSk7XG4gICAgICB9KVxuICAgICAgLm9uKCd0YndjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMuZ2V0Q29udGVudCgpKTtcbiAgICAgIH0pXG4gICAgICAub24oJ3Rid2ZvY3VzJywgKCkgPT4ge1xuICAgICAgICB0aGlzLl9vblRvdWNoKCk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLl9jb25maWcgJiYgdGhpcy5fY29uZmlnLmV2ZW50cykge1xuICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5fY29uZmlnLmV2ZW50cztcbiAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaChldmVudE5hbWUgPT4ge1xuICAgICAgICBlZGl0b3Iub24oZXZlbnROYW1lLCBldmVudHNbZXZlbnROYW1lXSgpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoID0gZm47XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0VmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLl9lZGl0b3IgJiYgdGhpcy5fZWRpdG9yLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0Q29udGVudCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gZGlzYWJsZWQ7XG5cbiAgICBpZiAodGhpcy5fZWRpdG9yKSB7XG4gICAgICAkKHRoaXMuX2VkaXRvci5uYXRpdmVFbGVtZW50KS50cnVtYm93eWcodGhpcy5fZGlzYWJsZWQgPyAnZGlzYWJsZScgOiAnZW5hYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgJCh0aGlzLl9lZGl0b3IubmF0aXZlRWxlbWVudCkudHJ1bWJvd3lnKCdkZXN0cm95Jyk7XG4gIH1cblxuICBwcml2YXRlIHNldENvbnRlbnQoY29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgJCh0aGlzLl9lZGl0b3IubmF0aXZlRWxlbWVudCkudHJ1bWJvd3lnKCdodG1sJywgY29udGVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRlbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJCh0aGlzLl9lZGl0b3IubmF0aXZlRWxlbWVudCkudHJ1bWJvd3lnKCdodG1sJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5qZWN0LCBJbnB1dCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEVkaXRvckJhc2UgfSBmcm9tICcuLi9jb21tb25zL2VkaXRvci1iYXNlJztcbmltcG9ydCB7IFRydW1ib3d5Z09wdGlvbnMgfSBmcm9tICcuLi9jb25maWdzL3RydW1ib3d5Zy1vcHRpb25zJztcbmltcG9ydCB7IFRSVU1CT1dZR19PUFRJT05TIH0gZnJvbSAnLi4vY29uZmlncy9pbmplY3Rpb24tdG9rZW4nO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4VHJ1bWJvd3lnRWRpdG9yXSdcbn0pXG5leHBvcnQgY2xhc3MgRWRpdG9yRGlyZWN0aXZlIGV4dGVuZHMgRWRpdG9yQmFzZSB7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IFRydW1ib3d5Z09wdGlvbnMgfCBudWxsO1xuXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBlZGl0b3JDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgQEluamVjdChUUlVNQk9XWUdfT1BUSU9OUylcbiAgICBAT3B0aW9uYWwoKVxuICAgIHByb3RlY3RlZCBfY29uZmlnOiBUcnVtYm93eWdPcHRpb25zLFxuICAgIHByb3RlY3RlZCBfZWRpdG9yOiBFbGVtZW50UmVmXG4gICkge1xuICAgIHN1cGVyKGVkaXRvckNvbnRyb2wsIF9jb25maWcpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9wdGlvbmFsLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEVkaXRvckJhc2UgfSBmcm9tICcuLi8uLi9jb21tb25zL2VkaXRvci1iYXNlJztcbmltcG9ydCB7IFRSVU1CT1dZR19PUFRJT05TIH0gZnJvbSAnLi4vLi4vY29uZmlncy9pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHsgVHJ1bWJvd3lnT3B0aW9ucyB9IGZyb20gJy4uLy4uL2NvbmZpZ3MvdHJ1bWJvd3lnLW9wdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ25neC10cnVtYm93eWctZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2VkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VkaXRvci5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRWRpdG9yQ29tcG9uZW50IGV4dGVuZHMgRWRpdG9yQmFzZSB7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IFRydW1ib3d5Z09wdGlvbnMgfCBudWxsO1xuXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCBudWxsO1xuXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcicpIF9lZGl0b3I6IEVsZW1lbnRSZWY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGVkaXRvckNvbnRyb2w6IE5nQ29udHJvbCxcbiAgICBASW5qZWN0KFRSVU1CT1dZR19PUFRJT05TKVxuICAgIEBPcHRpb25hbCgpXG4gICAgcHJvdGVjdGVkIF9jb25maWc6IFRydW1ib3d5Z09wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoZWRpdG9yQ29udHJvbCwgX2NvbmZpZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcnVtYm93eWdPcHRpb25zIH0gZnJvbSAnLi9jb25maWdzL3RydW1ib3d5Zy1vcHRpb25zJztcbmltcG9ydCB7IFRSVU1CT1dZR19PUFRJT05TIH0gZnJvbSAnLi9jb25maWdzL2luamVjdGlvbi10b2tlbic7XG5pbXBvcnQgeyBFZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZS9lZGl0b3IuZGlyZWN0aXZlJztcbmltcG9ydCB7IEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50L2VkaXRvci9lZGl0b3IuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbRWRpdG9yRGlyZWN0aXZlLCBFZGl0b3JDb21wb25lbnRdLFxuICBleHBvcnRzOiBbRWRpdG9yRGlyZWN0aXZlLCBFZGl0b3JDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIE5neFRydW1ib3d5Z01vZHVsZSB7XG4gIHN0YXRpYyB3aXRoQ29uZmlnKG9wdGlvbnM6IFRydW1ib3d5Z09wdGlvbnMpOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE5neFRydW1ib3d5Z01vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVFJVTUJPV1lHX09QVElPTlMsIHVzZVZhbHVlOiBvcHRpb25zIH1dXG4gICAgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSx1QkFHYSxpQkFBaUIsR0FBRyxJQUFJLGNBQWMsQ0FDakQsbUJBQW1CLENBQ3BCOzs7Ozs7Ozs7QUNDRDs7Ozs7SUFlRSxZQUFzQixhQUF3QixFQUFZLE9BQXlCO1FBQTdELGtCQUFhLEdBQWIsYUFBYSxDQUFXO1FBQVksWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDakYsSUFDRSxPQUFPO1lBQ1AsT0FBTyxDQUFDLE1BQU07YUFDYixPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FDekYsRUFBRTtZQUNBLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0hBQXNILENBQ3ZILENBQUM7U0FDSDtRQUNELGFBQWEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0tBQ3BDOzs7O0lBRUQsUUFBUTtRQUNOLHVCQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUMzQyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztLQUNsQzs7OztJQUVELGVBQWU7UUFDYix1QkFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO2FBQ3pDLFNBQVMsbUJBQU0sSUFB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