mat-contenteditable
Version:
Angular contenteditable directive for Angular forms and Material Design
185 lines (184 loc) • 14.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Directive, Input, HostBinding, ViewContainerRef, Optional, Self } from '@angular/core';
import { MatFormFieldControl, ErrorStateMatcher } from '@angular/material';
import { Subject } from 'rxjs';
import { NgControl, NgForm, FormGroupDirective } from '@angular/forms';
import { _MatInputMixinBase } from './mat-contenteditable.directive';
export class MatCkeditorDirective extends _MatInputMixinBase {
/**
* @param {?} viewRef
* @param {?} ngControl
* @param {?} _parentForm
* @param {?} _parentFormGroup
* @param {?} _defaultErrorStateMatcher
*/
constructor(
// @Host() @Self() @Optional() public editor: CKEditorComponent,
viewRef, ngControl, _parentForm, _parentFormGroup, _defaultErrorStateMatcher) {
super(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl);
this.viewRef = viewRef;
this.ngControl = ngControl;
this.stateChanges = new Subject();
this.id = `mat-input-${MatCkeditorDirective.nextId++}`;
// Need support from Ckeditor
this.placeholder = '';
this.contentEmpty = ['<br>', '<p> </p>'];
this.focused = false;
this.required = false;
this.controlType = 'mat-input';
this.describedBy = '';
}
/**
* @return {?}
*/
get value() {
return !!this.editor.editorInstance && this.editor.editorInstance.getData();
}
/**
* @param {?} value
* @return {?}
*/
set value(value) {
if (value !== this.value) {
this.editor.data = value;
this.stateChanges.next();
}
}
/**
* @return {?}
*/
get empty() {
return !this.value || this.contentEmpty.includes(this.value);
}
/**
* @return {?}
*/
get shouldLabelFloat() { return this.focused || !this.empty; }
/**
* @param {?} isDisabled
* @return {?}
*/
set disabled(isDisabled) {
this.editor.setDisabledState(isDisabled);
this.stateChanges.next();
}
/**
* @return {?}
*/
get disabled() {
return this.editor.disabled;
}
/**
* @return {?}
*/
ngOnInit() {
// Can't use injection to get component reference
// https://github.com/angular/angular/issues/8277
this.editor = this.viewRef['_data'].componentView.component;
this.editor.blur.subscribe(() => {
this.focused = false;
this.stateChanges.next();
});
this.editor.focus.subscribe(() => {
this.focused = true;
this.stateChanges.next();
});
}
/**
* @return {?}
*/
ngDoCheck() {
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();
}
}
/**
* @param {?} ids
* @return {?}
*/
setDescribedByIds(ids) {
this.describedBy = ids.join(' ');
}
/**
* @return {?}
*/
onContainerClick() {
if (this.editor.editorInstance) {
this.editor.editorInstance.editing.view.focus();
this.stateChanges.next();
}
}
}
/**
* Implemented as part of MatFormFieldControl.
* See https://material.angular.io/guide/creating-a-custom-form-field-control
*/
MatCkeditorDirective.nextId = 0;
MatCkeditorDirective.decorators = [
{ type: Directive, args: [{
selector: '[matCkeditor]',
providers: [
{ provide: MatFormFieldControl, useExisting: MatCkeditorDirective },
]
},] }
];
/** @nocollapse */
MatCkeditorDirective.ctorParameters = () => [
{ type: ViewContainerRef },
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }] },
{ type: NgForm, decorators: [{ type: Optional }] },
{ type: FormGroupDirective, decorators: [{ type: Optional }] },
{ type: ErrorStateMatcher }
];
MatCkeditorDirective.propDecorators = {
value: [{ type: Input }],
id: [{ type: HostBinding }],
placeholder: [{ type: Input }],
contentEmpty: [{ type: Input }],
required: [{ type: Input }],
disabled: [{ type: Input }],
errorState: [{ type: HostBinding, args: ['attr.aria-invalid',] }],
errorStateMatcher: [{ type: Input }],
describedBy: [{ type: HostBinding, args: ['attr.aria-describedby',] }]
};
if (false) {
/**
* Implemented as part of MatFormFieldControl.
* See https://material.angular.io/guide/creating-a-custom-form-field-control
* @type {?}
*/
MatCkeditorDirective.nextId;
/** @type {?} */
MatCkeditorDirective.prototype.stateChanges;
/** @type {?} */
MatCkeditorDirective.prototype.id;
/** @type {?} */
MatCkeditorDirective.prototype.placeholder;
/** @type {?} */
MatCkeditorDirective.prototype.contentEmpty;
/** @type {?} */
MatCkeditorDirective.prototype.focused;
/** @type {?} */
MatCkeditorDirective.prototype.required;
/** @type {?} */
MatCkeditorDirective.prototype.errorState;
/** @type {?} */
MatCkeditorDirective.prototype.errorStateMatcher;
/** @type {?} */
MatCkeditorDirective.prototype.controlType;
/** @type {?} */
MatCkeditorDirective.prototype.describedBy;
/** @type {?} */
MatCkeditorDirective.prototype.editor;
/** @type {?} */
MatCkeditorDirective.prototype.viewRef;
/** @type {?} */
MatCkeditorDirective.prototype.ngControl;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWNrZWRpdG9yLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdC1jb250ZW50ZWRpdGFibGUvIiwic291cmNlcyI6WyJsaWIvbWF0LWNrZWRpdG9yLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFVLFFBQVEsRUFBRSxJQUFJLEVBQVcsTUFBTSxlQUFlLENBQUM7QUFDakgsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUF1QixNQUFNLG1CQUFtQixDQUFDO0FBRWhHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQVNyRSxNQUFNLE9BQU8sb0JBQXNCLFNBQVEsa0JBQWtCOzs7Ozs7OztJQXdEM0Q7O0lBRXFCLE9BQXlCLEVBQ2pCLFNBQW9CLEVBQ25DLFdBQW1CLEVBQ25CLGdCQUFvQyxFQUNoRCx5QkFBNEM7UUFFNUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQU54RCxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUNqQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBdkNqRCxvQkFBdUMsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUUzRCxVQUFvQixhQUFhLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7O1FBR2pFLG1CQUF1QixFQUFFLENBQUM7UUFFMUIsb0JBQWtDLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBTzVELGVBQVUsS0FBSyxDQUFDO1FBRWhCLGdCQUFvQixLQUFLLENBQUM7UUFjMUIsbUJBQWMsV0FB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S0FBSzt5QkFTTCxXQUFXLFNBQUMsbUJBQW1CO2dDQUMvQixLQUFLOzBCQUlMLFdBQVcsU0FBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBIb3N0QmluZGluZywgVmlld0NvbnRhaW5lclJlZiwgT25Jbml0LCBPcHRpb25hbCwgU2VsZiwgRG9DaGVjayB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkQ29udHJvbCwgRXJyb3JTdGF0ZU1hdGNoZXIsIENhblVwZGF0ZUVycm9yU3RhdGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG4vLyBpbXBvcnQgeyBDS0VkaXRvckNvbXBvbmVudCB9IGZyb20gJ0Bja2VkaXRvci9ja2VkaXRvcjUtYW5ndWxhci8vY2tlZGl0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE5nQ29udHJvbCwgTmdGb3JtLCBGb3JtR3JvdXBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBfTWF0SW5wdXRNaXhpbkJhc2UgfSBmcm9tICcuL21hdC1jb250ZW50ZWRpdGFibGUuZGlyZWN0aXZlJztcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbWF0Q2tlZGl0b3JdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBNYXRGb3JtRmllbGRDb250cm9sLCB1c2VFeGlzdGluZzogTWF0Q2tlZGl0b3JEaXJlY3RpdmUgfSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBNYXRDa2VkaXRvckRpcmVjdGl2ZSAgZXh0ZW5kcyBfTWF0SW5wdXRNaXhpbkJhc2VcbiAgaW1wbGVtZW50cyBNYXRGb3JtRmllbGRDb250cm9sPHN0cmluZz4sIERvQ2hlY2ssIENhblVwZGF0ZUVycm9yU3RhdGUgLCBPbkluaXQge1xuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuXG4gICAqIFNlZSBodHRwczovL21hdGVyaWFsLmFuZ3VsYXIuaW8vZ3VpZGUvY3JlYXRpbmctYS1jdXN0b20tZm9ybS1maWVsZC1jb250cm9sXG4gICAqL1xuICBzdGF0aWMgbmV4dElkID0gMDtcblxuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gISF0aGlzLmVkaXRvci5lZGl0b3JJbnN0YW5jZSAmJiB0aGlzLmVkaXRvci5lZGl0b3JJbnN0YW5jZS5nZXREYXRhKCk7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRhdGEgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICByZWFkb25seSBzdGF0ZUNoYW5nZXM6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIEBIb3N0QmluZGluZygpIGlkID0gYG1hdC1pbnB1dC0ke01hdENrZWRpdG9yRGlyZWN0aXZlLm5leHRJZCsrfWA7XG5cbiAgLy8gTmVlZCBzdXBwb3J0IGZyb20gQ2tlZGl0b3JcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcblxuICBASW5wdXQoKSBjb250ZW50RW1wdHk6IHN0cmluZ1tdID0gWyc8YnI+JywgJzxwPiZuYnNwOzwvcD4nXTtcbiAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy52YWx1ZSB8fCB0aGlzLmNvbnRlbnRFbXB0eS5pbmNsdWRlcyh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIGdldCBzaG91bGRMYWJlbEZsb2F0KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5OyB9XG5cbiAgZm9jdXNlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmVkaXRvci5zZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpO1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcbiAgfVxuICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdG9yLmRpc2FibGVkO1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaW52YWxpZCcpIGVycm9yU3RhdGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcjtcblxuICBjb250cm9sVHlwZSA9ICdtYXQtaW5wdXQnO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRlc2NyaWJlZGJ5JykgZGVzY3JpYmVkQnkgPSAnJztcblxuICBwcm90ZWN0ZWQgZWRpdG9yO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8vIEBIb3N0KCkgQFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgZWRpdG9yOiBDS0VkaXRvckNvbXBvbmVudCxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld1JlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcbiAgICBAT3B0aW9uYWwoKSBfcGFyZW50Rm9ybTogTmdGb3JtLFxuICAgIEBPcHRpb25hbCgpIF9wYXJlbnRGb3JtR3JvdXA6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgICBfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOiBFcnJvclN0YXRlTWF0Y2hlcixcbiAgKSB7XG4gICAgc3VwZXIoX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciwgX3BhcmVudEZvcm0sIF9wYXJlbnRGb3JtR3JvdXAsIG5nQ29udHJvbCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBDYW4ndCB1c2UgaW5qZWN0aW9uIHRvIGdldCBjb21wb25lbnQgcmVmZXJlbmNlXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvODI3N1xuICAgIHRoaXMuZWRpdG9yID0gdGhpcy52aWV3UmVmWydfZGF0YSddLmNvbXBvbmVudFZpZXcuY29tcG9uZW50O1xuICAgIHRoaXMuZWRpdG9yLmJsdXIuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH0pO1xuICAgIHRoaXMuZWRpdG9yLmZvY3VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdEb0NoZWNrKCkge1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCkge1xuICAgICAgLy8gV2UgbmVlZCB0byByZS1ldmFsdWF0ZSB0aGlzIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUsIGJlY2F1c2UgdGhlcmUgYXJlIHNvbWVcbiAgICAgIC8vIGVycm9yIHRyaWdnZXJzIHRoYXQgd2UgY2FuJ3Qgc3Vic2NyaWJlIHRvIChlLmcuIHBhcmVudCBmb3JtIHN1Ym1pc3Npb25zKS4gVGhpcyBtZWFuc1xuICAgICAgLy8gdGhhdCB3aGF0ZXZlciBsb2dpYyBpcyBpbiBoZXJlIGhhcyB0byBiZSBzdXBlciBsZWFuIG9yIHdlIHJpc2sgZGVzdHJveWluZyB0aGUgcGVyZm9ybWFuY2UuXG4gICAgICB0aGlzLnVwZGF0ZUVycm9yU3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICBzZXREZXNjcmliZWRCeUlkcyhpZHM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZXNjcmliZWRCeSA9IGlkcy5qb2luKCcgJyk7XG4gIH1cblxuICBvbkNvbnRhaW5lckNsaWNrKCkge1xuICAgIGlmICh0aGlzLmVkaXRvci5lZGl0b3JJbnN0YW5jZSkge1xuICAgICAgdGhpcy5lZGl0b3IuZWRpdG9ySW5zdGFuY2UuZWRpdGluZy52aWV3LmZvY3VzKCk7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbn1cbiJdfQ==