UNPKG

mat-contenteditable

Version:

Angular contenteditable directive for Angular forms and Material Design

165 lines 16.1 kB
import { __decorate, __extends, __metadata, __param } from "tslib"; import { Directive, Input, HostBinding, ViewContainerRef, OnInit, Optional, Self, DoCheck, Host } from '@angular/core'; import { MatFormFieldControl } from '@angular/material/form-field'; import { CKEditorComponent } from '@ckeditor/ckeditor5-angular'; import { Subject } from 'rxjs'; import { NgControl, NgForm, FormGroupDirective } from '@angular/forms'; import { CanUpdateErrorState, ErrorStateMatcher } from '@angular/material/core'; import { _MatInputMixinBase } from './mat-contenteditable.directive'; var MatCkeditorDirective = /** @class */ (function (_super) { __extends(MatCkeditorDirective, _super); function MatCkeditorDirective(editor, viewRef, ngControl, _parentForm, _parentFormGroup, _defaultErrorStateMatcher) { var _this = _super.call(this, _defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl) || this; _this.editor = editor; _this.viewRef = viewRef; _this.ngControl = ngControl; _this.stateChanges = new Subject(); _this.id = "mat-input-" + MatCkeditorDirective_1.nextId++; // Need support from Ckeditor _this.placeholder = ''; _this.contentEmpty = ['<br>', '<p>&nbsp;</p>']; _this.focused = false; _this.required = false; _this.controlType = 'mat-input'; _this.describedBy = ''; return _this; } MatCkeditorDirective_1 = MatCkeditorDirective; Object.defineProperty(MatCkeditorDirective.prototype, "value", { get: function () { return !!this.editor.editorInstance && this.editor.editorInstance.getData(); }, set: function (value) { if (value !== this.value) { this.editor.data = value; this.stateChanges.next(); } }, enumerable: true, configurable: true }); Object.defineProperty(MatCkeditorDirective.prototype, "empty", { get: function () { return !this.value || this.contentEmpty.includes(this.value); }, enumerable: true, configurable: true }); Object.defineProperty(MatCkeditorDirective.prototype, "shouldLabelFloat", { get: function () { return this.focused || !this.empty; }, enumerable: true, configurable: true }); Object.defineProperty(MatCkeditorDirective.prototype, "disabled", { get: function () { return this.editor.disabled; }, set: function (isDisabled) { this.editor.setDisabledState(isDisabled); this.stateChanges.next(); }, enumerable: true, configurable: true }); MatCkeditorDirective.prototype.ngOnInit = function () { var _this = this; this.editor.blur.subscribe(function () { _this.focused = false; _this.stateChanges.next(); }); this.editor.focus.subscribe(function () { _this.focused = true; _this.stateChanges.next(); }); }; MatCkeditorDirective.prototype.ngDoCheck = function () { if (this.ngControl) { // We need to re-evaluate this on every change detection cycle, because there are some // error triggers that we can't subscribe to (e.g. parent form submissions). This means // that whatever logic is in here has to be super lean or we risk destroying the performance. this.updateErrorState(); } }; MatCkeditorDirective.prototype.setDescribedByIds = function (ids) { this.describedBy = ids.join(' '); }; MatCkeditorDirective.prototype.onContainerClick = function () { if (this.editor.editorInstance) { this.editor.editorInstance.editing.view.focus(); this.stateChanges.next(); } }; var MatCkeditorDirective_1; /** * Implemented as part of MatFormFieldControl. * See https://material.angular.io/guide/creating-a-custom-form-field-control */ MatCkeditorDirective.nextId = 0; MatCkeditorDirective.ctorParameters = function () { return [ { type: CKEditorComponent, decorators: [{ type: Host }, { type: Self }, { type: Optional }] }, { type: ViewContainerRef }, { type: NgControl, decorators: [{ type: Optional }, { type: Self }] }, { type: NgForm, decorators: [{ type: Optional }] }, { type: FormGroupDirective, decorators: [{ type: Optional }] }, { type: ErrorStateMatcher } ]; }; __decorate([ Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], MatCkeditorDirective.prototype, "value", null); __decorate([ HostBinding(), __metadata("design:type", Object) ], MatCkeditorDirective.prototype, "id", void 0); __decorate([ Input(), __metadata("design:type", Object) ], MatCkeditorDirective.prototype, "placeholder", void 0); __decorate([ Input(), __metadata("design:type", Array) ], MatCkeditorDirective.prototype, "contentEmpty", void 0); __decorate([ Input(), __metadata("design:type", Object) ], MatCkeditorDirective.prototype, "required", void 0); __decorate([ Input(), __metadata("design:type", Boolean), __metadata("design:paramtypes", [Boolean]) ], MatCkeditorDirective.prototype, "disabled", null); __decorate([ HostBinding('attr.aria-invalid'), __metadata("design:type", Boolean) ], MatCkeditorDirective.prototype, "errorState", void 0); __decorate([ Input(), __metadata("design:type", ErrorStateMatcher) ], MatCkeditorDirective.prototype, "errorStateMatcher", void 0); __decorate([ HostBinding('attr.aria-describedby'), __metadata("design:type", Object) ], MatCkeditorDirective.prototype, "describedBy", void 0); MatCkeditorDirective = MatCkeditorDirective_1 = __decorate([ Directive({ selector: '[matCkeditor]', providers: [ { provide: MatFormFieldControl, useExisting: MatCkeditorDirective_1 }, ] }), __param(0, Host()), __param(0, Self()), __param(0, Optional()), __param(2, Optional()), __param(2, Self()), __param(3, Optional()), __param(4, Optional()), __metadata("design:paramtypes", [CKEditorComponent, ViewContainerRef, NgControl, NgForm, FormGroupDirective, ErrorStateMatcher]) ], MatCkeditorDirective); return MatCkeditorDirective; }(_MatInputMixinBase)); export { MatCkeditorDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWNrZWRpdG9yLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdC1jb250ZW50ZWRpdGFibGUvIiwic291cmNlcyI6WyJsaWIvbWF0LWNrZWRpdG9yLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBU3JFO0lBQTJDLHdDQUFrQjtJQXNEM0QsOEJBQ3FDLE1BQXlCLEVBQ3pDLE9BQXlCLEVBQ2pCLFNBQW9CLEVBQ25DLFdBQW1CLEVBQ25CLGdCQUFvQyxFQUNoRCx5QkFBNEM7UUFOOUMsWUFRRSxrQkFBTSx5QkFBeUIsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLFNBQzNFO1FBUm9DLFlBQU0sR0FBTixNQUFNLENBQW1CO1FBQ3pDLGFBQU8sR0FBUCxPQUFPLENBQWtCO1FBQ2pCLGVBQVMsR0FBVCxTQUFTLENBQVc7UUFyQ3hDLGtCQUFZLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7UUFFNUMsUUFBRSxHQUFHLGVBQWEsc0JBQW9CLENBQUMsTUFB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IElucHV0LCBIb3N0QmluZGluZywgVmlld0NvbnRhaW5lclJlZiwgT25Jbml0LCBPcHRpb25hbCwgU2VsZiwgRG9DaGVjaywgSG9zdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgQ0tFZGl0b3JDb21wb25lbnQgfSBmcm9tICdAY2tlZGl0b3IvY2tlZGl0b3I1LWFuZ3VsYXInO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmdDb250cm9sLCBOZ0Zvcm0sIEZvcm1Hcm91cERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENhblVwZGF0ZUVycm9yU3RhdGUsIEVycm9yU3RhdGVNYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBfTWF0SW5wdXRNaXhpbkJhc2UgfSBmcm9tICcuL21hdC1jb250ZW50ZWRpdGFibGUuZGlyZWN0aXZlJztcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbWF0Q2tlZGl0b3JdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBNYXRGb3JtRmllbGRDb250cm9sLCB1c2VFeGlzdGluZzogTWF0Q2tlZGl0b3JEaXJlY3RpdmUgfSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBNYXRDa2VkaXRvckRpcmVjdGl2ZSAgZXh0ZW5kcyBfTWF0SW5wdXRNaXhpbkJhc2VcbiAgaW1wbGVtZW50cyBNYXRGb3JtRmllbGRDb250cm9sPHN0cmluZz4sIERvQ2hlY2ssIENhblVwZGF0ZUVycm9yU3RhdGUgLCBPbkluaXQge1xuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuXG4gICAqIFNlZSBodHRwczovL21hdGVyaWFsLmFuZ3VsYXIuaW8vZ3VpZGUvY3JlYXRpbmctYS1jdXN0b20tZm9ybS1maWVsZC1jb250cm9sXG4gICAqL1xuICBzdGF0aWMgbmV4dElkID0gMDtcblxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmVkaXRvci5lZGl0b3JJbnN0YW5jZSAmJiB0aGlzLmVkaXRvci5lZGl0b3JJbnN0YW5jZS5nZXREYXRhKCk7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRhdGEgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICByZWFkb25seSBzdGF0ZUNoYW5nZXM6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBIb3N0QmluZGluZygpIGlkID0gYG1hdC1pbnB1dC0ke01hdENrZWRpdG9yRGlyZWN0aXZlLm5leHRJZCsrfWA7XG5cbiAgLy8gTmVlZCBzdXBwb3J0IGZyb20gQ2tlZGl0b3JcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcblxuICBASW5wdXQoKSBjb250ZW50RW1wdHk6IHN0cmluZ1tdID0gWyc8YnI+JywgJzxwPiZuYnNwOzwvcD4nXTtcbiAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy52YWx1ZSB8fCB0aGlzLmNvbnRlbnRFbXB0eS5pbmNsdWRlcyh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIGdldCBzaG91bGRMYWJlbEZsb2F0KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5OyB9XG5cbiAgZm9jdXNlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVkaXRvci5zZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmRpc2FibGVkO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaW52YWxpZCcpIGVycm9yU3RhdGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcjtcblxuICBjb250cm9sVHlwZSA9ICdtYXQtaW5wdXQnO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRlc2NyaWJlZGJ5JykgZGVzY3JpYmVkQnkgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASG9zdCgpIEBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIGVkaXRvcjogQ0tFZGl0b3JDb21wb25lbnQsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHZpZXdSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBwdWJsaWMgbmdDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgQE9wdGlvbmFsKCkgX3BhcmVudEZvcm06IE5nRm9ybSxcbiAgICBAT3B0aW9uYWwoKSBfcGFyZW50Rm9ybUdyb3VwOiBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gICAgX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcjogRXJyb3JTdGF0ZU1hdGNoZXIsXG4gICkge1xuICAgIHN1cGVyKF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsIF9wYXJlbnRGb3JtLCBfcGFyZW50Rm9ybUdyb3VwLCBuZ0NvbnRyb2wpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5lZGl0b3IuYmx1ci5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfSk7XG4gICAgdGhpcy5lZGl0b3IuZm9jdXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0RvQ2hlY2soKSB7XG4gICAgaWYgKHRoaXMubmdDb250cm9sKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHJlLWV2YWx1YXRlIHRoaXMgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSwgYmVjYXVzZSB0aGVyZSBhcmUgc29tZVxuICAgICAgLy8gZXJyb3IgdHJpZ2dlcnMgdGhhdCB3ZSBjYW4ndCBzdWJzY3JpYmUgdG8gKGUuZy4gcGFyZW50IGZvcm0gc3VibWlzc2lvbnMpLiBUaGlzIG1lYW5zXG4gICAgICAvLyB0aGF0IHdoYXRldmVyIGxvZ2ljIGlzIGluIGhlcmUgaGFzIHRvIGJlIHN1cGVyIGxlYW4gb3Igd2UgcmlzayBkZXN0cm95aW5nIHRoZSBwZXJmb3JtYW5jZS5cbiAgICAgIHRoaXMudXBkYXRlRXJyb3JTdGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldERlc2NyaWJlZEJ5SWRzKGlkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlc2NyaWJlZEJ5ID0gaWRzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIG9uQ29udGFpbmVyQ2xpY2soKSB7XG4gICAgaWYgKHRoaXMuZWRpdG9yLmVkaXRvckluc3RhbmNlKSB7XG4gICAgICB0aGlzLmVkaXRvci5lZGl0b3JJbnN0YW5jZS5lZGl0aW5nLnZpZXcuZm9jdXMoKTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxufVxuIl19