From ae6bb54be8f769a178c3be13a2e83ccf32ecb740 Mon Sep 17 00:00:00 2001 From: Kartheek Palla <palla.kartheekreddy@gmail.com> Date: Tue, 1 Jun 2021 16:11:42 +0530 Subject: [PATCH] Revert "#SB-23246 fix: fixing the rich text editor issue" --- package.json | 1 + projects/common-form-elements/ng-package.json | 3 +- projects/common-form-elements/package.json | 3 +- .../src/lib/common-form-config.ts | 1 + .../dynamic-field/dynamic-field.directive.ts | 3 +- .../dynamic-form/dynamic-form.component.ts | 21 +++++- .../dynamic-richtext.component.css | 1 + .../dynamic-richtext.component.html | 6 +- .../dynamic-richtext.component.ts | 65 ++++++++++++++++++- 9 files changed, 94 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index eb9905c..be1a844 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@angular/compiler-cli": "~8.0.0", "@angular/language-service": "~8.0.0", "@ionic/angular-toolkit": "^2.0.0", + "@project-sunbird/ckeditor-build-classic": "0.0.4", "@project-sunbird/client-services": "3.8.6", "@types/jasmine": "~2.8.8", "@types/jasminewd2": "~2.0.3", diff --git a/projects/common-form-elements/ng-package.json b/projects/common-form-elements/ng-package.json index 4d7d88f..f1fe2b0 100644 --- a/projects/common-form-elements/ng-package.json +++ b/projects/common-form-elements/ng-package.json @@ -7,6 +7,7 @@ "whitelistedNonPeerDependencies": [ "immutable", "ngx-chips", - "moment" + "moment", + "@project-sunbird/ckeditor-build-classic" ] } diff --git a/projects/common-form-elements/package.json b/projects/common-form-elements/package.json index 74df1a5..222a9be 100644 --- a/projects/common-form-elements/package.json +++ b/projects/common-form-elements/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "immutable": "^4.0.0-rc.12", - "moment": "^2.29.1" + "moment": "^2.29.1", + "@project-sunbird/ckeditor-build-classic": "0.0.4" } } diff --git a/projects/common-form-elements/src/lib/common-form-config.ts b/projects/common-form-elements/src/lib/common-form-config.ts index 5d1d806..26fd156 100644 --- a/projects/common-form-elements/src/lib/common-form-config.ts +++ b/projects/common-form-elements/src/lib/common-form-config.ts @@ -137,4 +137,5 @@ export interface CustomFormControl extends FormControl { termsForDependantFields?: any; customEventHandler$?: Subject<any>; shouldListenToCustomEvent?: Boolean; + richTextCharacterCount?: any; } diff --git a/projects/common-form-elements/src/lib/dynamic-field/dynamic-field.directive.ts b/projects/common-form-elements/src/lib/dynamic-field/dynamic-field.directive.ts index c4df120..e2c8785 100644 --- a/projects/common-form-elements/src/lib/dynamic-field/dynamic-field.directive.ts +++ b/projects/common-form-elements/src/lib/dynamic-field/dynamic-field.directive.ts @@ -38,7 +38,8 @@ const componentMapper = { checkbox: DynamicCheckboxComponent, timer: DynamicTimerComponent, framework: DynamicFrameworkComponent, - frameworkCategorySelect: DynamicFrameworkCategorySelectComponent + frameworkCategorySelect: DynamicFrameworkCategorySelectComponent, + richtext: DynamicRichtextComponent }; @Directive({ diff --git a/projects/common-form-elements/src/lib/dynamic-form/dynamic-form.component.ts b/projects/common-form-elements/src/lib/dynamic-form/dynamic-form.component.ts index 78de473..6f2304b 100644 --- a/projects/common-form-elements/src/lib/dynamic-form/dynamic-form.component.ts +++ b/projects/common-form-elements/src/lib/dynamic-form/dynamic-form.component.ts @@ -241,10 +241,18 @@ export class DynamicFormComponent implements OnInit, OnChanges, OnDestroy { validationList.push(Validators.pattern(element.validations[i].value as string)); break; case 'minLength': + if (element.inputType === 'richtext') { + validationList.push(this.validateRichTextLength.bind(this, 'minLength' , '<', element.validations[i].value )); + } else { validationList.push(Validators.minLength(element.validations[i].value as number)); + } break; case 'maxLength': + if (element.inputType === 'richtext') { + validationList.push(this.validateRichTextLength.bind(this, 'maxLength' , '>', element.validations[i].value )); + } else { validationList.push(Validators.maxLength(element.validations[i].value as number)); + } break; case 'min': validationList.push(Validators.min(element.validations[i].value as number)); @@ -337,5 +345,16 @@ export class DynamicFormComponent implements OnInit, OnChanges, OnDestroy { return null; // return result ? {compare: true} : null; } - + validateRichTextLength(validationType, keyOperator, validationValue, control: AbstractControl): ValidationErrors | null { + let comp; + if (control.touched) { + comp = FieldComparator.operators[keyOperator](control['richTextCharacterCount'], validationValue); + } else { + comp = false; + } + if (comp && (control.touched || control.dirty)) { + return { [_.toLower(validationType)]: true }; + } + return null; +} } diff --git a/projects/common-form-elements/src/lib/dynamic-richtext/dynamic-richtext.component.css b/projects/common-form-elements/src/lib/dynamic-richtext/dynamic-richtext.component.css index 8437110..8f51d27 100644 --- a/projects/common-form-elements/src/lib/dynamic-richtext/dynamic-richtext.component.css +++ b/projects/common-form-elements/src/lib/dynamic-richtext/dynamic-richtext.component.css @@ -65,3 +65,4 @@ label { padding: 0 4px; } + .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_se, .ck.ck-dropdown .ck-dropdown__panel.ck-dropdown__panel_sw{transform:inherit !important} \ No newline at end of file diff --git a/projects/common-form-elements/src/lib/dynamic-richtext/dynamic-richtext.component.html b/projects/common-form-elements/src/lib/dynamic-richtext/dynamic-richtext.component.html index 981ddcf..4329634 100644 --- a/projects/common-form-elements/src/lib/dynamic-richtext/dynamic-richtext.component.html +++ b/projects/common-form-elements/src/lib/dynamic-richtext/dynamic-richtext.component.html @@ -5,10 +5,10 @@ <div class="prefix" *ngIf="prefix"> <span>{{prefix}}</span> </div> - <textarea id="richTextCount" [formControl]="formControlRef" [class.valid]="formControlRef.valid && + <textarea *ngIf="showEditor" id="richTextCount" #EDITOR [formControl]="formControlRef" [class.valid]="formControlRef.valid && (formControlRef.dirty || formControlRef.touched)" [class.invalid]="formControlRef.invalid && -(formControlRef.dirty || formControlRef.touched)" class="sb-textbox {{disabled}} - " placeholder={{placeholder}} type="text" +(formControlRef.dirty || formControlRef.touched)" class="sb-textbox {{disabled}} ck ck-reset ck-editor ck-rounded-corners +ck ck-reset ck-editor ck-rounded-corners " placeholder={{placeholder}} type="text" [attr.disabled]="disabled ? true : null"></textarea> <div class="async-icons" *ngIf="asyncValidation && asyncValidation?.trigger"> </div> diff --git a/projects/common-form-elements/src/lib/dynamic-richtext/dynamic-richtext.component.ts b/projects/common-form-elements/src/lib/dynamic-richtext/dynamic-richtext.component.ts index 7eeda10..b22814c 100644 --- a/projects/common-form-elements/src/lib/dynamic-richtext/dynamic-richtext.component.ts +++ b/projects/common-form-elements/src/lib/dynamic-richtext/dynamic-richtext.component.ts @@ -1,13 +1,16 @@ -import { Component, Input, OnInit, AfterViewInit, ViewChild, ElementRef } from '@angular/core'; +import { Component, Input, OnInit, AfterViewInit, ViewChild, ElementRef, ViewEncapsulation } from '@angular/core'; import { FieldConfigAsyncValidation, CustomFormControl } from '../common-form-config'; +import ClassicEditor from '@project-sunbird/ckeditor-build-classic'; import * as _ from 'lodash-es'; @Component({ selector: 'sb-dynamic-richtext', templateUrl: './dynamic-richtext.component.html', styleUrls: ['./dynamic-richtext.component.css'], + encapsulation: ViewEncapsulation.None, }) export class DynamicRichtextComponent implements OnInit, AfterViewInit { + @ViewChild('EDITOR', { static: false }) public editorRef: ElementRef; @Input() asyncValidation?: FieldConfigAsyncValidation; @Input() label: String; @Input() labelHtml: any; @@ -20,13 +23,39 @@ export class DynamicRichtextComponent implements OnInit, AfterViewInit { @Input() disabled: Boolean; @Input() visible: Boolean; @ViewChild('validationTrigger', { static: false }) validationTrigger: ElementRef; - + showEditor = false; + editorConfig: any; + editorInstance: any; + characterCount: any; constructor() { } ngOnInit() { + this.editorConfig = { + toolbar: ['bold', '|', 'italic', '|', 'underline', '|', 'insertTable', + '|', 'numberedList', '|', 'BulletedList', '|', 'fontSize', '|', + ], + fontSize: { + options: [ + 9, + 11, + 13, + 15, + 17, + 19, + 21, + 23, + 25 + ] + }, + isReadOnly: this.disabled, + removePlugins: ['ImageCaption', 'mathtype', 'ChemType'] + }; + this.showEditor = true; } ngAfterViewInit() { - + if (this.visible) { + this.initializeEditors(); + } if (this.asyncValidation && this.asyncValidation.asyncValidatorFactory && this.formControlRef) { if (this.formControlRef.asyncValidator) { return; @@ -38,4 +67,34 @@ export class DynamicRichtextComponent implements OnInit, AfterViewInit { } } + initializeEditors() { + ClassicEditor.create(this.editorRef.nativeElement, { + extraPlugins: ['Font', 'Table'], + toolbar: this.editorConfig.toolbar, + fontSize: this.editorConfig.fontSize, + isReadOnly: this.editorConfig.isReadOnly, + removePlugins: this.editorConfig.removePlugins, + wordCount: { + onUpdate: stats => { + this.characterCount = stats.characters; + }, + } + }) + .then(editor => { + this.editorInstance = editor; + + editor.isReadOnly = this.disabled; + this.onChangeEditor(this.editorInstance); + }) + .catch(error => { + console.error(error.stack); + }); + } + onChangeEditor(editor) { + editor.model.document.on('change', (eventInfo, batch) => { + this.formControlRef.markAsTouched(); + this.formControlRef.richTextCharacterCount = this.characterCount; + this.formControlRef.patchValue(editor.getData()); + }); + } } \ No newline at end of file -- GitLab